J'aimerais stocker le hachage d'un mot de passe sur le téléphone, mais je ne sais pas comment le faire. Je n'arrive qu'à trouver des méthodes de cryptage. Comment le mot de passe doit-il être haché correctement?
117
MISE À JOUR : CETTE RÉPONSE EST GRAVEMENT DÉCOULÉE . Veuillez plutôt utiliser les recommandations de https://stackoverflow.com/a/10402129/251311 .
Vous pouvez soit utiliser
var md5 = new MD5CryptoServiceProvider();
var md5data = md5.ComputeHash(data);
ou
var sha1 = new SHA1CryptoServiceProvider();
var sha1data = sha1.ComputeHash(data);
Pour obtenir data
un tableau d'octets, vous pouvez utiliser
var data = Encoding.ASCII.GetBytes(password);
et pour récupérer la chaîne de md5data
ousha1data
var hashedPassword = ASCIIEncoding.GetString(md5data);
using
instruction ou de l'appelerClear()
lorsque vous avez terminé d'utiliser l'implémentation.md5
c'est assez bon pour presque tous les types de tâches. Ses vulnérabilités font également référence à des situations très spécifiques et obligent presque l'attaquant à en savoir beaucoup sur la cryptographie.La plupart des autres réponses ici sont quelque peu dépassées par rapport aux meilleures pratiques d'aujourd'hui. En tant que tel, voici l'application de l'utilisation de PBKDF2 /
Rfc2898DeriveBytes
pour stocker et vérifier les mots de passe. Le code suivant est dans une classe autonome dans cet article: Un autre exemple de la façon de stocker un hachage de mot de passe salé . Les bases sont vraiment simples, alors voici les détails:ÉTAPE 1 Créez la valeur salt avec un PRNG cryptographique:
ÉTAPE 2 Créez le Rfc2898DeriveBytes et obtenez la valeur de hachage:
ÉTAPE 3 Combinez les octets de sel et de mot de passe pour une utilisation ultérieure:
ÉTAPE 4 Transformez le sel et le hachage combinés en une chaîne pour le stockage
ÉTAPE 5 Vérifiez le mot de passe saisi par l'utilisateur par rapport à un mot de passe enregistré
Remarque: selon les exigences de performance de votre application spécifique, la valeur
100000
peut être réduite. Une valeur minimale doit être d'environ10000
.la source
Sur la base de la bonne réponse de csharptest.net , j'ai écrit une classe pour ceci:
Usage:
Un exemple de hachage pourrait être ceci:
Comme vous pouvez le voir, j'ai également inclus les itérations dans le hachage pour une utilisation facile et la possibilité de mettre à niveau cela, si nous avons besoin de mettre à niveau.
Si vous êtes intéressé par .net core, j'ai également une version .net core sur Code Review .
la source
V1
etV2
la méthode de vérification dont vous avez besoin.J'utilise un hachage et un sel pour le cryptage de mon mot de passe (c'est le même hachage utilisé par Asp.Net Membership):
la source
la source
Les réponses de @ csharptest.net et de Christian Gollhardt sont excellentes, merci beaucoup. Mais après avoir exécuté ce code en production avec des millions d'enregistrements, j'ai découvert qu'il y avait une fuite de mémoire. Les classes RNGCryptoServiceProvider et Rfc2898DeriveBytes sont dérivées de IDisposable mais nous ne les supprimons pas. J'écrirai ma solution comme réponse si quelqu'un a besoin d'une version supprimée.
Usage:
la source
Je pense que l'utilisation de KeyDerivation.Pbkdf2 est meilleure que Rfc2898DeriveBytes.
Exemple et explication: mots de passe de hachage dans ASP.NET Core
Ceci est un exemple de code de l'article. Et c'est un niveau de sécurité minimum. Pour l'augmenter, j'utiliserais à la place du paramètre KeyDerivationPrf.HMACSHA1
KeyDerivationPrf.HMACSHA256 ou KeyDerivationPrf.HMACSHA512.
Ne faites pas de compromis sur le hachage de mot de passe. Il existe de nombreuses méthodes mathématiquement valables pour optimiser le hachage de mot de passe. Les conséquences pourraient être désastreuses. Une fois qu'un malfaiteur peut mettre la main sur la table de hachage des mots de passe de vos utilisateurs, il lui sera relativement facile de casser les mots de passe étant donné que l'algorithme est faible ou que la mise en œuvre est incorrecte. Il a beaucoup de temps (temps x puissance de l'ordinateur) pour déchiffrer les mots de passe. Le hachage du mot de passe doit être cryptographiquement puissant pour transformer «beaucoup de temps» en «temps déraisonnable ».
Encore un point à ajouter
La vérification du hachage prend du temps (et c'est bien). Lorsque l'utilisateur saisit un nom d'utilisateur incorrect, il ne faut pas de temps pour vérifier que le nom d'utilisateur est incorrect. Lorsque le nom d'utilisateur est correct, nous commençons la vérification du mot de passe - c'est un processus relativement long.
Pour un hacker, il serait très facile de comprendre si l'utilisateur existe ou non.
Assurez-vous de ne pas renvoyer de réponse immédiate lorsque le nom d'utilisateur est erroné.
Inutile de dire: ne répondez jamais à ce qui ne va pas. Juste général "Les informations d'identification sont fausses".
la source