Hachage des mots de passe avec MD5 ou sha-256 C#
Je suis en train d'écrire un formulaire d'inscription pour une demande, mais encore avoir des problèmes avec la nouvelle c#.
Je suis à la recherche pour crypter/hachage des mots de passe md5 ou sha-256, de préférence sha-256.
Tout de bons exemples? Je veux qu'il soit en mesure de prendre les informations de "chaîne de mot de passe;" et puis de hachage et de le stocker dans la variable "string hPassword;". Des idées?
- Qu'allez-vous faire avec le hachage de mot de passe? Stocker dans une base de données? Puis il suffit de hachage n'est pas suffisant ( arc-en-ciel de la table ). L'utilisation de sels.
- Je vais être de les stocker dans une base de données. Que recommandez-vous.
- Les gens s'il vous plaît être conscient que les réponses ci-dessous sont plus à jour. Et garder à l'esprit que vous ne devriez jamais jamais utiliser MD5 pour le hachage de mot de passe. Il est vieux, cassé, et obsolètes. Le plus simple, up-to-date et sécurisée, la solution pour la plupart des gens serait bcrypt. Au moins, quand ce commentaire a été écrit 🙂 Argon2 est probablement va être le standard de la recommandation bientôt.
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser un simple hash, ou même un salée de hachage. Utiliser une sorte de touche-le renforcement de la technique comme bcrypt (avec un .NET mise en œuvre ici) ou PBKDF2 (avec un construit-dans la mise en œuvre).
Voici un exemple d'utilisation de PBKDF2.
Pour générer une clé de votre mot de passe...
Et ensuite tester si un mot de passe est valide...
nvarchar(max)
a problème de performance , ce que vous pensez pouvoir est d'utiliser 128 longueur le changement de longueur ?.blog
domaine. Voici donc un lien où StackOverflow détails de l'évolution de l'utilisation PBKDF2.Vous allez avoir à utiliser le
System.De sécurité.La cryptographie
espace de noms; en particulier, laMD5
de la classe ou laSHA256
de la classe.Dessin un peu le code de la cette page, et avec la connaissance que les deux classes ont la même classe de base (
HashAlgorithm
), vous pouvez utiliser une fonction comme ceci:Ensuite, vous pouvez l'appeler comme cela (MD5):
Ou pour SHA256:
Edit: Ajout De Sel De Soutien
Comme dtb souligné dans les commentaires, ce code serait plus forte si elle comprenait la possibilité d'ajouter des sel. Si vous n'êtes pas familier avec elle, le sel est un ensemble de bits aléatoires, qui sont inclus en tant que contribution à la fonction de hachage, qui va un long chemin pour contrecarrer les attaques de dictionnaire à l'encontre d'un hachage de mot de passe (par exemple, à l'aide d'un table arc-en-ciel). Voici une version modifiée de la
ComputeHash
fonction qui prend en charge le sel:Espère que cela vous a été utile!
ASCIIEncoding.Default
point de prêter à confusion retourne l'encodage UTF-16. Je suggèreEncoding.UTF8
(ASCII serait trop limité).byte[] salt
paramètre à votreComputeHash
méthode et la faire précéder de ces octets àinputBytes
puis j'ai officiellement l'amour de votre réponse 🙂Rfc2898DeriveBytes
) est plus sécurisé et nécessite en réalité moins code.MD5CryptoServiceProvider
etSHA256CryptoServiceProvider
(et lesHashAlgorithm
s) mettre en œuvre lesIDisposable
de l'interface et donc de leur création et de la durée de vie devrait être de façon optimale enveloppé dans unusing
bloc plutôt que le nouvel objet transmis en tant que paramètre.Vous devriez toujours le sel le mot de passe avant de hachage lors de leur stockage dans la base de données.
Recommandé colonnes de base de données:
La plupart des postes que vous trouverez en ligne allons parler d'un codage ASCII, le sel et le hachage, mais qui n'est pas nécessaire et ne fait qu'ajouter inutiles calcul. Aussi, si vous utilisez SHA-1, alors la sortie sera seulement 20 octets de sorte que votre hash champ dans la base de données ne doit être de 20 octets de longueur. Je comprends votre demande sur SHA-256, mais à moins d'avoir une raison impérieuse, à l'aide de l'algorithme SHA-1 avec une valeur salt sera suffisant dans la plupart des pratiques commerciales. Si vous insistez sur SHA-256, puis le hachage champ dans la base de données doit être de 32 octets de longueur.
Ci-dessous sont quelques fonctions qui va générer le sel, calculer la valeur de hachage et de vérifier le hachage contre un mot de passe.
Le sel de la fonction ci-dessous génère un fort niveau de chiffrement le sel comme un Entier de 4 cryptographique créé octets aléatoires.
Le mot de passe peut alors être hashé en utilisant le sel avec la fonction ci-dessous. Le sel est concaténé à la passe et puis le hash est calculé.
Vérification du mot de passe peut être fait simplement par le calcul du hachage et de comparer ensuite les attendus de hachage.
Si vous allez stocker les mots de passe hachés, l'utilisation bcrypt au lieu de l'algorithme SHA-256. Le problème est que SHA-256 est optimisé pour la vitesse, ce qui rend plus facile pour une attaque en force brute sur les mots de passe doivent quelqu'un d'accéder à votre base de données.
Lire cet article: Assez Avec Les Tables Arc-En-Ciel: Ce Que Vous Devez Savoir Sur Les Régimes De Mot De Passe Sécurisé et ce réponse à une précédente DONC, la question.
Quelques citations de l'article:
bcrypt
. Quand vous dites que "StackOverflow abandonné bcrypt", on pourrait avoir l'impression qu'il ya quelque chose de mal avecbcrypt
.PBKDF2 est à l'aide de HMACSHA1.......si vous voulez plus moderne HMACSHA256 ou HMACSHA512 la mise en œuvre et voulez toujours la clé d'étirement pour rendre l'algorithme plus lent je suggère cette API: https://sourceforge.net/projects/pwdtknet/
Ici est la pleine mise en œuvre de la persistance ignorant SecuredPassword classe
Et tests:
TL;DR l'utilisation Microsoft.AspNetCore.La cryptographie.KeyDerivation, la mise en œuvre de PBKDF2 avec SHA-512.
La bonne idée de commencer avec le hachage de mot de passe est de regarder ce qui OWASP lignes directrices dire. La liste des recommandés algorithmes comprend Argon2, PBKDF2, scrypt, et bcrypt. Tous ces algorithmes peuvent être réglés pour adapter le temps qu'il faut pour hacher un mot de passe, et, en conséquence, le temps de la fissure par force brute. Tous ces algorithmes utilisent le sel pour protéger des tables arc-en-attaques.
Aucune de ces algorithmes est très faible, mais il existe quelques différences:
a résisté à l'épreuve du temps. Il est assez résistant pour GPU
les attaques, mais pas pour FPGA
fonctions. Il n'offre pas une protection spécifique contre le GPU ou ASIC attaques, surtout si un affaiblissement de la fonction de hachage comme SHA-1 est utilisé, mais il est, cependant, certifiée FIPS si c'est important pour vous, et encore acceptable si le nombre d'itérations est assez grand.
Basées sur des algorithmes seul, je serais probablement aller avec bcrypt, PBKDF2 le moins favorable.
Cependant, ce n'est pas l'histoire complète, parce que même le meilleur algorithme peut être rendue précaire par une mauvaise mise en œuvre. Regardons ce qui est disponible pour .NET plate-forme:
bien connu libsodium de la bibliothèque, par exemple
https://github.com/adamcaudill/libsodium-net. L'idée est que
la plupart de la crypto est mis en œuvre par libsodium, ce qui est considérable
de soutien, et la "non testé" pièces sont assez limitées. Toutefois, dans
la cryptographie détails signifier beaucoup de choses, donc combiné avec Argon2 être
relativement récente, j'avais la traiter comme une expérimentales option
Rfc2898DeriveBytes classe. Cependant, la mise en œuvre ne peut utiliser hachage SHA-1 de la fonction, qui est jugée trop rapide pour être sûr de nos jours
Microsoft.AspNetCore.La cryptographie.KeyDerivation paquet
disponible via NuGet. Il fournit PBKDF2 algorithme SHA-1, SHA-256, ou SHA-512 fonctions de hachage, ce qui est considérablement mieux que
Rfc2898DeriveBytes
. Le plus grand avantage ici est que la mise en œuvre est fournie par Microsoft, et bien que je ne peut évaluer correctement le chiffrement de la diligence de développeurs de Microsoft contre BCrypt.net ou libsodium les développeurs, il est tout à fait logique de faire confiance, car, si vous exécutez un .NET application, vous êtes dépendant de Microsoft déjà. On pourrait également s'attendre à Microsoft pour libérer les mises à jour si des problèmes de sécurité sont trouvés. Avec de la chance.De résumer la recherche jusqu'à ce point, alors que PBKDF2 peut-être le moins préféré algorithme des quatre, la disponibilité de Microsoft fourni par la mise en œuvre des atouts que, si la décision raisonnable serait d'utiliser
Microsoft.AspNetCore.Cryptography.KeyDerivation
.Le récent paquet au moment de cibles .NET Standard 2.0, aussi disponible dans .NET Core 2.0 ou .NET Framework 4.6.1 ou plus tard. Si vous utilisez plus tôt cadre de version, il est possible d'utiliser la version précédente de l'emballage, 1.1.3, qui cible les .NET Framework 4.5.1 ou .NET Core 1.0. Malheureusement, il n'est pas possible de l'utiliser même dans des versions antérieures de .NET.
La documentation et l'exemple de travail est disponible à docs.microsoft.com. Cependant, ne pas faire de copier-coller en tant qu'il est, il y a encore des décisions qu'un développeur doit faire.
La première décision à prendre est ce que la fonction de hachage à utiliser. Options disponibles incluent SHA-1, SHA-256 et SHA-512. De ceux, SHA-1 est vraiment trop rapide pour être sûr, SHA-256 est décent, mais je vous recommande SHA-512, parce que soi-disant, de ses opérations en 64 bits utilisation rend plus difficile de bénéficier de GPU-attaques.
Ensuite, vous devez choisir le hachage de mot de passe de sortie de longueur et le sel de la longueur. Il ne fait pas de sens d'avoir de sortie de plus de la fonction de hachage de sortie (par exemple 512 bits pour l'algorithme SHA-512), et il serait probablement plus sûr d'avoir exactement comme que. Pour le sel de la longueur, les opinions divergent. 128 bits devrait être suffisant, mais dans tous les cas, la longueur du plus long que le hachage de sortie longueur certainement n'est pas de fournir tous les avantages.
Ensuite, il y a un nombre d'itérations. Plus elle est grande, plus les hashs sont à craquer, mais il faut plus d'utilisateurs du journal de dans le. Je vous suggère de choisir de sorte que le hachage prend de 0,25 - 1 secondes sur typique de système de production, et dans tous les cas, il ne doit pas être inférieur à 10000.
Normalement, vous obtiendrez tableau d'octets que le sel et les valeurs de hachage. Utilisation Base64 pour les convertir en chaînes. Vous pouvez choisir d'utiliser deux colonnes dans la base de données, ou de combiner le sel et le mot de passe dans une colonne à l'aide d'un séparateur, qui n'est pas rencontrée en Base64.
N'oubliez pas de concevoir un hachage de mot de passe de stockage d'une façon qui permet de déplacer de manière transparente pour un meilleur algorithme de hachage à l'avenir.
Le Système.De sécurité.La cryptographie.SHA256 classe devrait faire l'affaire:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx
Veuillez utiliser ce que j'ai le même problèmes avant, mais pourrait résoudre ce sera la petit extrait de code