Cryptage efficace du mot de passe
J'ai pris un coup d'oeil à la StackOverflow question, "Le mot de passe de Chiffrement /Couche de Base de données AES ou de l'Application de la Couche d'AES," et je voudrais de manière efficace et efficiente de hachage mes mots de passe lors de l'inscription (web app) et ensuite être en mesure de vérifier qu'ils sont corrects sur connexion. Je suis à l'aide de VB, mais à l'aise à l'aide de C#.
J'aimerais utiliser Jeff Atwood du Cryptage de classe décrite dans ".NET de Chiffrement Simplifiée" car il est vraiment facile à comprendre. Il dispose d'un hachage de la classe mais je n'ai aucune idée de comment le "login" et de comparer les hachages après qu'ils ont été hachés. C'est Jeff démonstration de ses méthodes de hachage à l'aide de son Cryptage de classe:
Sub DemoHash()
Dim d As New Encryption.Data( _
"{ts '2004-10-09 08:10:04'}The world is beautiful and needs caring by its children")
Dim hash As New Encryption.Hash(Encryption.Hash.Provider.SHA1)
Dim hash2 As New Encryption.Hash(Encryption.Hash.Provider.SHA256)
Dim hash3 As New Encryption.Hash(Encryption.Hash.Provider.SHA384)
Dim hash4 As New Encryption.Hash(Encryption.Hash.Provider.SHA512)
Dim hash5 As New Encryption.Hash(Encryption.Hash.Provider.MD5)
Dim hash6 As New Encryption.Hash(Encryption.Hash.Provider.CRC32)
hash.Calculate(d)
hash2.Calculate(d)
hash3.Calculate(d)
hash4.Calculate(d)
hash5.Calculate(d)
Console.WriteLine("SHA1: " & hash.Value.Hex)
Console.WriteLine("SHA256: " & hash2.Value.Hex)
Console.WriteLine("SHA384: " & hash3.Value.Hex)
Console.WriteLine("SHA512: " & hash4.Value.Hex)
Console.WriteLine("MD5: " & hash5.Value.Hex)
Console.WriteLine("CRC32: " & hash6.Calculate(d).Hex)
Console.WriteLine()
Dim salt As New Encryption.Data("salty!")
Console.WriteLine("Salted CRC32: " & hash6.Calculate(d, salt).Hex)
Console.WriteLine("Press ENTER to continue...")
Console.ReadLine()
End Sub
Donc mes questions sont:
- Je peux crypter le mot de passe (même si je n'ai pas l'intention de les stocker) et le hash d'une chaîne. Si je devais avoir un utilisateur appelé "barry" avec un mot de passe de 'fishlegs', quelle est la meilleure façon de conserver son mot de passe et récupérer?
- Dans SQL Server; est binaire ou nvarchar la meilleure option pour le stockage de la table de hachage?
- Basée sur le "barry" et son mot de passe de ce qui est effectivement le hachage de stockage? Est-il un cryptage de "fishlegs' annexé à un sel?
La cryptographie est dur!
Merci à tous ceux qui peuvent aider...
source d'informationauteur dooburt
Vous devez vous connecter pour publier un commentaire.
Hmm, je pense que vous êtes tout simplement pas certains concepts de base liés à la façon dont le hachage des œuvres. Laissez-moi vous expliquer brièvement. Je vais commencer simple et complexe sur ma réponse plus tard, donc s'il vous plaît lire le tout, l'information au début ne sera pas sécurisée.
Ce que vous souhaitez utiliser pour stocker un mot de passe est une fonction connue comme un "one-way hash". Ce que cela signifie, c'est que, pour toutes les suggestions que vous nourrissez la fonction, la même entrée donnera toujours le même résultat. Cependant, il n'est pas processus mathématiques qui vous permet de prendre que la chaîne de résultats et comprendre ce que l'entrée d'origine a été.
Prenons MD5 comme un exemple de fonction de hachage. Si je lance MD5 sur la chaîne "mot de passe", je vais toujours obtenir le résultat "5f4dcc3b5aa765d61d8327deb882cf99". Toutefois, si vous étiez tout simplement de donner à quelqu'un que la chaîne de résultat ("5f4d..."), il est impossible pour eux d'appliquer des processus mathématiques à l'inverse de la fonction et de comprendre qu'il venait de "mot de passe".
Ce que cela signifie, c'est que lorsqu'un utilisateur met en place son mot de passe, vous devez appliquer une fonction de hachage, et de stocker le résultat. Donc, au lieu de les stocker "mot de passe", vous le magasin "5f4dcc3b5aa765d61d8327deb882cf99". Ensuite, lorsque l'utilisateur essaie d'ouvrir une session, vous prenez ce que vous avez tapé dans la zone mot de passe sur le formulaire de connexion, et d'appliquer la même fonction de hachage. Si vous obtenez le même résultat que ce qui est stocké dans la base de données, ils doivent avoir entré le mot de passe comme ils l'avaient initialement choisi, même si vous n'avez aucune idée de ce que le mot de passe d'origine était réellement.
Maintenant, même si il est impossible de "inverse" d'une fonction de hachage, le fait que la même entrée donne toujours le même résultat signifie que quelqu'un peut simplement construire une grande base de données de paires d'entrées/sorties, et de l'utiliser pour effectivement inverser les tables de hachage. Ceci est appelé un "rainbow table". Il ya beaucoup de disponibles sur internet, il n'est pas sûr pour une utilisation simple de hachage, juste au cas où votre base de données n'est jamais compromise. Qui est, même si elle est mathématiquement impossible de prendre "5f4dcc3b5aa765d61d8327deb882cf99" et comprendre qu'il est venu de l'exécution MD5 sur "mot de passe", il est très facile de déterminer que, dans la pratique. Tout ce que vous avez à faire est de lancer chaque mot dans un dictionnaire par MD5 et stocker les résultats, et vous pouvez facilement inverser des mots de passe simples.
C'est là que "salage". Si vous générez un hasard "sel" de la chaîne pour chaque utilisateur et de l'attacher à leur mot de passe, il efficacement les ruines arc-en-ciel tables. Par exemple, disons que le même utilisateur registres ci-dessus avec leur mot de passe "mot de passe". Nous la génération aléatoire de 8 caractères sel de joindre à leur mot de passe avant le hachage. Disons que c'est "A4BR82QX". Maintenant, au lieu de hachage "mot de passe", nous hash "A4BR82QXpassword". Ceci donne le résultat "87a4ba071c8bcb5efe457e6c4e6c4490", nous avons donc la stocker dans la base de données, ainsi que le sel de la chaîne. Puis, quand cet utilisateur essaie d'ouvrir une session, au lieu de directement de hachage et de comparer le mot de passe, ils sont entrés dans le formulaire de connexion, nous prenons ce qu'ils ont saisi, mis "A4BR82QX" en face d'elle à nouveau, et de hachage. Tout comme avant, si elle correspond au hash stocké, nous savons qu'ils ont entré le bon mot de passe.
Efficacement ce que vous avez fait ici est de faire en sorte que les pré-généré rainbow tables sont inutiles pour essayer de casser les mots de passe de votre base de données. Car le sel est aléatoire, et chaque utilisateur a un autre (en général), l'attaquant aura pour re-générer leurs rainbow tables pour chaque utilisateur individuel. C'est beaucoup plus difficile.
Cependant, il y a un problème, c'est que la génération du hash MD5 est rapide. Même si le salage comme cela les oblige à re-générer des tables arc-en-ciel, à cause de la façon dont rapidement MD5 est, certains décemment complet rainbow tables peuvent être créés très rapidement. Donc, si ils ont juste envie de craquer une haute valeur compte sur votre site, c'est pas vraiment un gros problème pour eux de passer du temps à générer des tables arc-en-ciel pour essayer d'inverser ce mot de passe. Si le haut de la valeur du compte mot de passe d'origine n'était pas assez sécurisé par lui-même, ça va encore être trouvé très rapidement, même avec le salage.
Donc, la prochaine étape est de trouver un lent fonction de hachage, et de l'utiliser au lieu d'un rapide tels que MD5. Avoir votre site de prendre un couple supplémentaire de secondes pour vérifier une connexion n'est pas une grosse affaire à tous. Mais lorsque quelqu'un tente de générer des rainbow tables pour cracker un mot de passe, le fait, pour chaque entrée prendre plusieurs secondes est une tuerie. J'ai écrit assez de place ici, donc je vais juste terminer par un lien vers cet article, qui va dans beaucoup de détails sur la sélection d'une bonne, ralentir fonction de hachage: Assez Avec Les Tables Arc-En-Ciel: Ce Que Vous Devez Savoir Sur Les Régimes De Mot De Passe Sécurisé.
Qui était assez énorme réponse, si c'est pas clair, s'il vous plaît laissez-moi savoir dans un commentaire et je vais modifier pour élaborer.
OK, donc un couple de choses à propos de Jeff classe de première de toutes. SHA1 et MD5 sont obsolète maintenant. CRC32 n'est pas adapté à tous les mots de passe. D'autre part, vous devriez être salage chaque hachage, de préférence avec un autre sel de la valeur. Généralement vous choisissez un niveau de chiffrement aléatoire bloc de données pour le présent, mais d'une simple pression, vous pouvez utiliser le nom d'utilisateur. À sel vous préfixe ou un suffixe, le sel de la valeur quelque part dans le processus. J'ai tendance à hacher le mot de passe, hacher le sel, mélanger les deux, puis de hachage de nouveau. Mais vous pouvez changer les choses autour d'elle n'a pas vraiment beaucoup d'importance, aussi longtemps que vous êtes cohérent.
Donc, plutôt que de confondre les choses plus loin avec Jeff classe permet de le faire de la façon classique.
Tout d'abord aléatoire sel génération.
Puis de hachage
Ce qui permettra de calculer un hash SHA256 et de le retourner comme un tableau d'octets.
Si vous étiez le salage vous feriez quelque chose comme ce qui suit
Et puis, si vous vous ennuyez de hachage de nouveau, ou les laisser tel qu'il est.
À son tour un tableau d'octets en une chaîne de caractères, si vous n'avez pas envie de stocker des octets que vous pouvez utiliser
Comparaisons de chaînes sont plus faciles que les octets comparaisons où vous avez à répéter sur chaque tableau, à vous de voir. N'oubliez pas si vous êtes à l'aide de random sels vous avez besoin de les stocker à côté du mot de passe.
Si vous voulez vérifier le mot de passe utilisateur, il suffit de prendre le nom d'utilisateur, de rechercher le sel, le ci-dessus à nouveau et voir si le hachage calculée et celle dans la base de données de correspondance. Il n'y a pas de (connus) à la façon de (facilement) de récupérer le mot de passe.
Ne pas confondre le chiffrement des mots de passe avec le hachage; avec une bonne fonction de hachage cryptographique, vous ne devriez pas être en mesure d'inverser le processus de hachage pour récupérer la chaîne d'origine.
Du tchad réponse ci-dessus est un excellent point-par-point de l'explication des concepts impliqués.
Ce sujet a été fait à la mort partout sur l'Internet, et pas seulement sur un Débordement de Pile; au sérieux - une simple recherche sur le web devrait vous trouver un joli guide complet.Merci, Jeff, pour répandre encore un groupe de la désinformation. Je suppose que nous allons voir une flopée erronée des questions au sujet de hachage, cryptage, etc. au cours de la semaine prochaine, pour ne pas mentionner la merde qui va venir de l'arithmétique à virgule flottante.
Je crois que le processus est comme ceci: la génération aléatoire de sel, de sorte 'fishlegs' + 'r4nd0mS4lt' obtenir 'fishlegsr4nd0mS4lt'. Ensuite, vous hachage, dire avec MD5 (bien que vous pourriez utiliser SHA256 pour être plus sûr) pour obtenir: 593d5518d759b4860188158ef4c71f28. Magasin et générés aléatoirement sel. Lorsque l'utilisateur se connecte, ajouter de l'aléatoire, de sel et de vérifier ensuite si son mot de passe entrés avec le sel correspond à la valeur de hachage dans la base de données.
Ce que vous êtes essentiellement de vouloir faire est de:
A) Sur la création de compte, vous obtenez un nom d'utilisateur et le mot de passe de l'utilisateur, vous hachage ceux qui, ensemble, avec votre propre sel et de stocker la chaîne résultante dans votre base de données comme:
Vous ne rangez jamais smotdepasse.
B) Lorsque l'utilisateur se connecte à effectuer exactement la même opération sur le nom d'utilisateur et mot de passe, puis de comparer la résultante de hachage à la déjà à valeur stockée dans la base de données de sorte que vous utilisez:
(Pardon pour toutes les erreurs, VB n'est pas ma langue)
Pour répondre à vos questions:
1) Voir ci-dessus. Ne jamais stocker le mot de passe directement, de stocker la valeur de hachage
2) l'utilisation d'un char(X), le nombre de caractères renvoyés à partir de la table de hachage est constante, de sorte que vous pouvez lui donner un sait la taille de stockage.
3) Ce que vous êtes effectivement le stockage est le mot de passe pour l'utilisateur salée avec leur nom d'utilisateur et aussi salée avec la constante sur votre serveur. Ce sera une chaîne de longueur fixe et vous ne pouvez pas modifier cette chaîne de retour vers les nom d'utilisateur et mot de passe.
nchar[n]
est probablement la meilleure option, car la commune algorithmes de hachage de produire des résultats de longueur constante (SHA1 sorties d'un hachage de 160 bits). La pratique courante est de convertir la valeur de hachage à Base64 de sorte qu'il peut être stockée sous forme de texte ASCII.ASP.NET comprend un SQL basé fournisseur d'appartenances qui vous permet de créer, de stocker et de vérifier encryped ou des mots de passe hachéssans que vous ayez à faire quoi que ce soit - comme Eric Lippert dit: