J'étais en train de parcourir l'un des articles de DavidHayden sur le hachage des mots de passe utilisateur .
Vraiment, je ne peux pas obtenir ce qu'il essaie de réaliser.
Voici son code:
private static string CreateSalt(int size)
{
//Generate a cryptographic random number.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
// Return a Base64 string representation of the random number.
return Convert.ToBase64String(buff);
}
private static string CreatePasswordHash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
string hashedPwd =
FormsAuthentication.HashPasswordForStoringInConfigFile(
saltAndPwd, "sha1");
return hashedPwd;
}
Existe-t-il une autre méthode C # pour hacher les mots de passe et y ajouter du sel?
SHA1
n'est pas de qualité cryptographique, vous devriez donc au moins utiliserSHA256
, qui produit 256 bits ou 32 octets. MAIS, 256 bits n'est PAS facilement convertible en base 64, car chaque caractère en base64 code 6 bits et 256 n'est pas entièrement divisible par 6. Vous avez donc besoin d'un dénominateur commun de 6 (pour base64) et 8 (pour les bits dans un octet) sur 256 bits, soit 264 bits ou 33 octets. TLDR: Utilisez 33.Réponses:
En fait, c'est un peu étrange, avec les conversions de chaînes - que le fournisseur d'appartenance fait pour les mettre dans des fichiers de configuration. Les hachages et les sels sont des blobs binaires, vous n'avez pas besoin de les convertir en chaînes à moins que vous ne souhaitiez les mettre dans des fichiers texte.
Dans mon livre, Beginning ASP.NET Security , (oh enfin, une excuse pour soutirer le livre) je fais ce qui suit
La génération de sel est l'exemple de la question. Vous pouvez convertir du texte en tableaux d'octets en utilisant
Encoding.UTF8.GetBytes(string)
. Si vous devez convertir un hachage en sa représentation sous forme de chaîne, vous pouvez utiliserConvert.ToBase64String
etConvert.FromBase64String
le reconvertir.Vous devez noter que vous ne pouvez pas utiliser l'opérateur d'égalité sur les tableaux d'octets, il vérifie les références et vous devez donc simplement parcourir les deux tableaux en vérifiant chaque octet ainsi
Utilisez toujours un nouveau sel par mot de passe. Les sels ne doivent pas être tenus secrets et peuvent être stockés avec le hachage lui-même.
la source
return array1.Length == array2.Length && !array1.Where((t, i) => t != array2[i]).Any();
Qu'est-ce que Blowdart a dit, mais avec un peu moins de code. Utilisez Linq ou
CopyTo
pour concaténer des tableaux.Linq a également un moyen facile de comparer vos tableaux d'octets.
Avant de mettre en œuvre tout cela, consultez cet article . Pour le hachage de mot de passe, vous voudrez peut-être un algorithme de hachage lent, pas rapide.
À cette fin, il y a la
Rfc2898DeriveBytes
classe qui est lente (et peut être ralentie), et peut répondre à la deuxième partie de la question originale en ce qu'elle peut prendre un mot de passe et du sel et renvoyer un hachage. Consultez cette question pour plus d'informations. Remarque: Stack Exchange utiliseRfc2898DeriveBytes
pour le hachage de mot de passe (code source ici ).la source
J'ai lu que les fonctions de hachage comme SHA256 n'étaient pas vraiment destinées à être utilisées avec le stockage des mots de passe: https://patrickmn.com/security/storing-passwords-securely/#notpasswordhashes
Au lieu de cela, les fonctions de dérivation de clé adaptative telles que PBKDF2, bcrypt ou scrypt l'étaient. En voici un basé sur PBKDF2 que Microsoft a écrit pour PasswordHasher dans leur bibliothèque Microsoft.AspNet.Identity:
Notez que cela nécessite l' installation du package nuget Microsoft.AspNetCore.Cryptography.KeyDerivation qui nécessite .NET Standard 2.0 (.NET 4.6.1 ou supérieur). Pour les versions antérieures de .NET, consultez la classe Crypto de la bibliothèque System.Web.Helpers de Microsoft.
Mise à jour novembre 2015
Réponse mise à jour pour utiliser une implémentation d'une autre bibliothèque Microsoft qui utilise le hachage PBKDF2-HMAC-SHA256 au lieu de PBKDF2-HMAC-SHA1 (notez que PBKDF2-HMAC-SHA1 est toujours sécurisé si iterCount est suffisamment élevé). Vous pouvez consulter la source à partir de laquelle le code simplifié a été copié car il gère en fait la validation et la mise à niveau des hachages implémentés à partir de la réponse précédente, utile si vous devez augmenter iterCount à l'avenir.
la source
PBKDF2SubkeyLength
à 20 octets. C'est la taille naturelle f SHA1 et l'augmenter au-delà de cela ralentit le défenseur sans ralentir l'attaquant. 2) Je recommande d'augmenter le nombre d'itérations. Je recommande 10k à 100k en fonction de votre budget de performance. 3) Une comparaison à temps constant ne ferait pas de mal non plus, mais n'a pas beaucoup d'impact pratique.Le sel est utilisé pour ajouter un niveau supplémentaire de complexité au hachage, pour rendre plus difficile la fissuration par force brute.
Extrait d'un article sur Sitepoint :
Il n'y a pas de méthode pour faire cela automatiquement dans .NET, vous devrez donc utiliser la solution ci-dessus.
la source
J'ai créé une classe qui a la méthode suivante:
Valider l'entrée
»
la source
Bah, c'est mieux! http://sourceforge.net/projects/pwdtknet/ et c'est mieux car ..... il effectue un étirement de clé ET utilise HMACSHA512 :)
la source
J'ai créé une bibliothèque SimpleHashing.Net pour faciliter le processus de hachage avec les classes de base fournies par Microsoft. Un SHA ordinaire ne suffit plus vraiment pour que les mots de passe soient stockés en toute sécurité.
La bibliothèque utilise l'idée du format de hachage de Bcrypt, mais comme il n'y a pas d'implémentation officielle de MS, je préfère utiliser ce qui est disponible dans le framework (c'est-à-dire PBKDF2), mais c'est un peu trop difficile hors de la boîte.
Voici un exemple rapide d'utilisation de la bibliothèque:
la source
Voici comment je fais. Je crée le hachage et le stocke à l'aide de l'
ProtectedData
API:la source
J'ai lu toutes les réponses et je pense que celles-ci suffisent, spécialement les articles @Michael avec hachage lent et @CodesInChaos de bons commentaires, mais j'ai décidé de partager mon extrait de code pour le hachage / validation qui peut être utile et ne nécessite pas [ Microsoft.AspNet.Cryptography .KeyDerivation ].
Veuillez prêter attention à la fonction SlowEquals qui est si importante, Enfin, j'espère que cette aide et n'hésitez pas à me conseiller sur de meilleures approches.
la source
Utilisez le
System.Web.Helpers.Crypto
package NuGet de Microsoft. Il ajoute automatiquement du sel au hachage.Vous hachez un mot de passe comme celui-ci:
var hash = Crypto.HashPassword("foo");
Vous vérifiez un mot de passe comme celui-ci:
var verified = Crypto.VerifyHashedPassword(hash, "foo");
la source
Si vous n'utilisez pas asp.net ou .net core, il y a aussi un moyen simple dans les projets> = .Net Standard 2.0.
Tout d'abord, vous pouvez définir la taille souhaitée du hachage, du sel et du numéro d'itération qui est lié à la durée de la génération du hachage:
Pour générer le hachage et le sel du mot de passe, vous pouvez utiliser quelque chose comme ceci:
Pour vérifier si le mot de passe entré par l'utilisateur est valide, vous pouvez vérifier avec les valeurs de votre base de données:
Le test unitaire suivant montre l'utilisation:
Source Microsoft Rfc2898DeriveBytes
la source
En réponse à cette partie de la question d'origine "Existe-t-il une autre méthode C # pour le hachage des mots de passe" Vous pouvez y parvenir en utilisant ASP.NET Identity v3.0 https://www.nuget.org/packages/Microsoft.AspNet.Identity. EntityFramework / 3.0.0-rc1-final
la source
la source
la source