web-dev-qa-db-fra.com

Comment enregistrer en toute sécurité nom d'utilisateur / mot de passe (local)?

Je crée une application Windows, à laquelle vous devez vous connecter en premier.
Les détails du compte se composent d'un nom d'utilisateur et d'un mot de passe. Ils doivent être enregistrés localement.
C'est juste une question de sécurité, ainsi les autres personnes utilisant le même ordinateur ne peuvent pas voir les données personnelles de chacun.
Quel est le moyen le plus sûr et le plus sûr de sauvegarder ces données?

Je ne veux pas utiliser de base de données, j'ai donc essayé certaines choses avec les fichiers de ressources.
Mais comme je suis un peu nouveau avec ça, je ne suis pas tout à fait sûr de ce que je fais et où je devrais chercher une solution.

97
Robin

Si vous souhaitez simplement vérifier/valider le nom d'utilisateur et le mot de passe entrés, utilisez la classe Rfc2898DerivedBytes (également appelée fonction de dérivation de clé basée sur le mot de passe 2 ou PBKDF2). C’est plus sûr que d’utiliser un cryptage comme Triple DES ou AES car il n’existe aucun moyen pratique de passer du résultat de RFC2898DerivedBytes au mot de passe. Vous ne pouvez passer d’un mot de passe qu’au résultat. Voir Peut-on utiliser le hash SHA1 du mot de passe comme sel pour dériver la clé de chiffrement et l'IV de la chaîne de mot de passe? pour un exemple et une discussion sur .Net ou Chaîne chiffrer/déchiffrer avec le mot de passe c # Style Metro pour WinRT/Metro.

Si vous stockez le mot de passe pour le réutiliser, par exemple pour le fournir à un tiers, utilisez le API de protection des données Windows (DPAPI) . Ceci utilise les clés générées et protégées du système d'exploitation et l'algorithme de chiffrement Triple DES pour chiffrer et déchiffrer les informations. Cela signifie que votre application n'a pas à s'inquiéter de la génération et de la protection des clés de cryptage, une préoccupation majeure lors de l'utilisation de la cryptographie.

En C #, utilisez la classe System.Security.Cryptography.ProtectedData . Par exemple, pour chiffrer une donnée, utilisez ProtectedData.Protect() :

// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes().
byte[] plaintext; 

// Generate additional entropy (will be used as the Initialization vector)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
    rng.GetBytes(entropy);
}

byte[] ciphertext = ProtectedData.Protect(plaintext, entropy,
    DataProtectionScope.CurrentUser);

Stockez l'entropie et le texte chiffré de manière sécurisée, par exemple dans un fichier ou une clé de registre avec des autorisations définies pour que seul l'utilisateur actuel puisse le lire. Pour accéder aux données d'origine, utilisez ProtectedData.Unprotect() :

byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
    DataProtectionScope.CurrentUser);

Notez qu'il existe des considérations de sécurité supplémentaires. Par exemple, évitez de stocker des secrets tels que des mots de passe en tant que string. Les chaînes sont immuables, car elles ne peuvent pas être notifiées en mémoire, de sorte que quelqu'un qui regarde la mémoire de l'application ou un vidage de mémoire peut voir le mot de passe. Utilisez SecureString ou un octet [] à la place et n'oubliez pas de les supprimer ou de les mettre à zéro dès que le mot de passe n'est plus nécessaire.

147
akton

J’ai déjà utilisé cela auparavant et je pense que pour que les informations d’identité persistent et de

  1. vous pouvez les écrire dans le fichier de configuration de l'application à l'aide de la classe ConfigurationManager
  2. sécuriser le mot de passe en utilisant la classe SecureString
  3. puis le chiffrer à l'aide d'outils dans l'espace de noms Cryptography.

Ce lien me sera d'une grande aide j'espère: Cliquez ici

8
Pradip

DPAPI est juste à cette fin. Utilisez DPAPI pour chiffrer le mot de passe lors de la première entrée de l'utilisateur, stockez-le dans un emplacement sécurisé (le registre de l'utilisateur, le répertoire de données de l'application de l'utilisateur, sont quelques choix). Chaque fois que l'application est lancée, vérifiez l'emplacement pour voir si votre clé existe, si elle utilise DPAPI pour la déchiffrer et permettre l'accès, sinon refusez-la.

4
swiftgp

Cela ne fonctionne que sous Windows, donc si vous envisagez d'utiliser la plate-forme multi-plates-formes dotnet, vous devrez chercher ailleurs. Voir https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md

4
Stephen Buck