Est-il plus sûr de hacher un mot de passe plusieurs fois?


43

J'ai lu à quelques reprises que, lorsque vous stockez des mots de passe, il est judicieux de "doubler le hachage" des chaînes (par exemple, avec md5 puis sha1, les deux avec des sels, évidemment).

Je suppose que la première question est, "est-ce vraiment correct?" Si non, alors s'il vous plaît, rejetez le reste de cette question :)

La raison pour laquelle je pose cette question est que, à première vue, je dirais que cela a du sens. Cependant, quand j'y pense, chaque fois qu'un hachage est modifié (éventuellement avec quelque chose d'ajouté), tout ce que je peux voir, c'est qu'il y a une réduction de la limite supérieure de "l'unicité" finale ... cette limite étant liée à l'entrée initiale.

En d'autres termes: nous avons x nombre de chaînes qui, une fois hachées, sont réduites à y chaînes possibles. C'est-à-dire qu'il y a des collisions dans le premier set. Passons maintenant du deuxième ensemble au troisième, n’est-il pas possible que la même chose se produise (par exemple, des collisions dans l’ensemble des chaînes «y» possibles qui entraînent le même hachage dans le troisième ensemble)?

Dans ma tête, tout ce que je vois est un "entonnoir" pour chaque appel de fonction de hachage, "canalisant" un ensemble infini de possibilités en un ensemble fini, etc., mais il est évident que chaque appel travaille sur l'ensemble fini qui le précède, ce qui nous donne une ne définissez pas plus grande que l'entrée.

Peut-être qu'un exemple expliquera mes divagations? Prenez 'hash_function_a' qui donnera 'a' et 'b' le hash '1' et donnera 'c' et 'd' le hash '2'. En utilisant cette fonction pour stocker les mots de passe, même si le mot de passe est 'a', je pourrais utiliser le mot de passe 'b'.

Prenez 'hash_function_b' qui donnera '1' et '2' le hash '3'. Si je devais utiliser ce comme un « hachage secondaire » après « hash_function_a » alors même si le mot de passe est « un » je pourrais utiliser « b », « c » ou « d ».

En plus de tout cela, je comprends que les sels devraient être utilisés, mais ils ne changent pas vraiment le fait que chaque fois que nous mappons les entrées 'x' à des sorties 'inférieures à x'. Je ne pense pas.

Quelqu'un peut-il m'expliquer s'il vous plaît ce qui me manque ici?

Merci!

EDIT: pour ce que ça vaut, je ne le fais pas moi-même, j'utilise bcrypt. Et je ne me préoccupe pas vraiment de savoir si c'est utile ou non pour "utiliser des cycles" pour un "pirate informatique". Je me demande vraiment si le processus réduit ou non la "sécurité" du point de vue de la collision de hash.


2
@ S.Lott: Je ne vois pas vraiment comment cela répond à la question, cependant ... tout ce qu'il dit est "ne le fais pas toi-même, utilise ce truc" ou "c'est bien de prendre du temps!". .. ni quelle réponse "est-ce réellement plus sûr". Encore une fois, à moins que je manque quelque chose.
Narcisse


Ce n'est pas sur le sujet de la sécurité informatique, mais cela semble bien correspondre à la cryptographie. En fait, cela ressemble beaucoup à cette question .

Je connais une entreprise qui voulait utiliser du sel MD5(password). Nous avons dit que ce n'était pas sécurisé, alors ils ont suggéré d'utiliser à la MD5(MD5(password))place ...
Configurateur

La réponse acceptée n'est pas la bonne réponse!
Markus

Réponses:


27

Ceci est plus adapté sur security.stackexchange mais ...

Le problème avec

hash1(hash2(hash3(...hashn(pass+salt)+salt)+salt)...)+salt)

est que cela est aussi fort que la fonction de hachage la plus faible de la chaîne. Par exemple, si hashn (le hachage le plus à l'intérieur) donne une collision, toute la chaîne de hachage donnera une collision ( quels que soient les autres hachages dans la chaîne ).

Une chaîne plus forte serait

hash1(hash2(hash3(...hashn(pass + salt) + pass + salt) + pass + salt)...) + pass + salt)

Ici, nous évitons le problème de collision précoce et générons essentiellement un sel qui dépend du mot de passe du hachage final.

Et si une étape de la chaîne entre en collision, cela n'a pas d'importance, car à l'étape suivante, le mot de passe est utilisé à nouveau et doit donner un résultat différent pour des mots de passe différents.


Donc maintenant, je vois que l'ajout de "mot de passe + sel" en tant que sel à la prochaine série de hachage pourrait augmenter la quantité de "choses" pouvant aller dans l'entonnoir. Maintenant, je dois simplement comprendre "combien". Merci.
Narcisse

En fait, je pense que je comprends maintenant: en forçant le mot de passe dans chaque couche du hachage, cela réduit-il réellement le nombre de collisions possibles en imposant essentiellement le "mot de passe en collision" et le mot de passe réel à des hachages correspondants pour chaque "appel" , droite? Je pense qu'il me manquait la partie "mettre le mot de passe à chaque couche"! Merci encore.
Narcisse

@Narcissus no prob et qui a également l'avantage de permettre des hachages internes plus faibles (tant que les hachages externe / final sont forts) car les hachages internes ne font que générer le sel pour la prochaine passe
phénomène de cliquet

hum, je pense que le problème est un peu plus grand (et plus profond) que cela. Avec les attaques arc-en-ciel, vous pouvez simplement générer des tableaux en tenant compte de tous vos hashes, et le problème demeure.
woliveirajr

4
@ Narcissus: dans une réponse très courte: oui, ce n'est pas plus sécurisé. Oui, c'est probablement encore moins sécurisé.
Woliveirajr

54

L'utilisation d'algorithmes de hachage différents est une mauvaise idée - elle réduira l'entropie au lieu de l'augmenter.

Cependant, en supposant que vous disposiez d'un algorithme de hachage fort sur le plan cryptographique et d'un bon sel, l'application répétée de la même fonction de hachage rend le processus de hachage plus onéreux. L'avantage de cela est que, lorsque d'autres moyens de déchiffrer le hachage du mot de passe échouent (devinettes, attaques par dictionnaire, tables arc-en-ciel, etc.) et que l'attaquant est forcé d'utiliser des techniques de force brute, il leur faut plus de temps pour essayer chaque mot de passe, simplement parce que ils doivent appliquer la même fonction de hachage plus souvent. Donc, si un cycle de hachage nécessitait un mois de force brute, son application douze fois augmenterait le temps estimé à un an.

Les algorithmes de hachage récents tels que bcrypt reposent sur cette idée; ils contiennent un paramètre permettant de contrôler la complexité de calcul du hachage, de sorte que vous puissiez l’adapter à mesure que le matériel avance: lorsque le matériel devient plus rapide d'un facteur deux, vous augmentez la complexité pour compenser, de sorte que le temps nécessaire pour forcer brutalement votre le hachage reste à peu près constant.


2
C'est la bonne réponse!
Markus

@ markus: d'après la discussion que j'ai lue, cela n'est correct qu'en raison de l'addition "et un bon sel" qui est abordée dans la réponse acceptée, n'est-ce pas? Pourquoi celle-ci est-elle correcte et la réponse acceptée non?
Narcisse

C'est la bonne réponse car la seule raison d'appliquer la même fonction de hachage plusieurs fois (paramétrée) est que vous pouvez utiliser cette itération pour ajuster le matériel plus rapidement. Sinon, il n’ya aucun avantage à hacher plusieurs fois.
Markus

@ Narcissus La clé ici est l'entropie. Il y a une différence entre hacher plusieurs fois en utilisant la même méthode et plusieurs fois en utilisant différentes méthodes.
sakisk

3

N'essayez pas d'écrire votre propre schéma de hachage de mot de passe, à moins que vous ne souhaitiez suivre un cours de cryptographie et / ou d'ingénierie de la sécurité.

Vous devez utiliser une implémentation bien établie du hachage de mot de passe, qui doit à son tour utiliser une fonction de dérivation de clé ( KDF ) telle que PBKDF2, bcrypt, scrypt ou le plus récent Argon2.

Les bonnes KDF incluent un facteur de travail, généralement un certain nombre d'itérations, afin d'augmenter le coût des attaques hors ligne. On pourrait dire que ces fichiers KDF hachent le mot de passe plusieurs fois, en utilisant le même algorithme à chaque fois. Il est inutile d'utiliser l'algorithme de résumé de messages multiples, comme l'ont souligné d'autres personnes.


1
le lien https://crackstation.net/hashing-security.htm est bloqué par un pare
gnat

1
@gnat Pour une raison quelconque, j'avais manqué votre commentaire concernant l'URL bloquée. Je l'ai remplacé par un lien vers wikipedia.
Erwan Legrand

2

En général, il n'est pas nécessaire d'utiliser plus d'un algorithme de hachage.

Ce que vous devez faire c'est:

Utilisez le sel: le sel ne sert pas juste pour votre mot de passe plus sécurisé , il est utilisé pour attaquer la table arc -en -Aboid. De cette façon, quelqu'un aura plus de difficulté à précalculer le hachage des mots de passe que vous stockez dans votre système.

Utilisez plusieurs interactions: au lieu de simplement faire SHA (mot de passe + sel), faites SHA (SHA (SHA (SHA (SHA (... mot clé SHA).).))). Ou, pour représenter autrement:

hash = sha(password + salt)
for i=1 , i=5000, i++ {
    hash = sha(hash + salt);
}

Et, enfin, choisissez une bonne fonction de hachage. SHA, MD5, etc., ne sont pas bons parce qu'ils sont trop rapides . Puisque vous voulez utiliser le hachage comme protection, vous feriez mieux d'utiliser des hachages plus lents. Jetez un coup d'œil à Bcrypt , PBKDF2 ou Scrypt , par exemple.

edit : après les observations, essayons de voir quelques points (désolé, longue explication pour arriver à la fin, car cela pourrait aider les autres à chercher des réponses similaires):

Si votre système est sécurisé, comme personne ne pourra jamais accéder au mot de passe stocké, vous n'avez pas besoin de hachage. Le mot de passe serait secret, personne ne le comprendrait.

Mais personne ne peut garantir que la base de données contenant les mots de passe sera volée. Voler la base de données, a tous les mots de passe. Ok, votre système et votre entreprise en subiront toutes les conséquences. Donc, nous pourrions essayer d'éviter cette fuite de mot de passe.

AVIS que nous ne sommes pas inquiets des attaques en ligne sur ce point. Pour une attaque en ligne, la meilleure solution consiste à ralentir après des mots de passe incorrects, à verrouiller le compte après quelques tentatives, etc. Une attaque en ligne consiste à ralentir les entrées de mot de passe .

Revenons donc au don't let them take my plain passwordsproblème. La réponse est simple: ne les stockez pas sous forme de texte brut. Ok, j'ai compris.

Comment éviter ça?

Crypter le mot de passe (?). Mais, comme vous le savez, si vous le chiffrez, vous pouvez le déchiffrer si vous avez la clé appropriée. Et vous vous retrouverez avec le problème de "où cacher" la clé. Hum, ça ne va pas, puisqu'ils vous ont eu la base de données, ils peuvent avoir votre clé. Ok, ne l'utilisons pas.

Donc, une autre approche: transformons le mot de passe en quelque chose d'autre qui ne peut pas être inversé et stockons-le. Et pour vérifier si le mot de passe fourni est correct, nous répétons le même processus et vérifions si les deux valeurs transformées correspondent. S'ils correspondent = le bon mot de passe a été fourni.

Ok, jusqu'ici tout va bien. Utilisons du hash MD5 dans le mot de passe. Mais ... si quelqu'un a notre valeur de mot de passe hachée stockée, il peut disposer de beaucoup de puissance informatique pour calculer le hachage MD5 de chaque mot de passe possible (force brute), afin de pouvoir trouver le mot de passe d'origine. Ou, pire encore, il peut stocker tous les MD5 de toutes les combinaisons de caractères et trouver facilement le mot de passe. Donc, faites beaucoup d'itérations, la chose HASH (HASH (HASH () ())), pour rendre les choses plus difficiles, parce que cela prendra plus de temps.

Mais même si cela peut être évité, la table arc-en-ciel a été créée pour accélérer ce genre de protection.

Alors, utilisons du sel dessus. De cette façon, à chaque interaction, le sel est réutilisé. Celui qui essaiera d’attaquer vos mots de passe devra générer la table arc-en-ciel en considérant que le sel est ajouté à chaque fois. Et quand il génère cette table arc-en-ciel, puisqu'elle a été générée avec un sel, il devra calculer à nouveau avec l'autre sel, il devra donc passer du temps pour chaque mot de passe (= chaque sel). Salt n’ajoutera pas "plus de complexité" au mot de passe, il laissera simplement à l'attaquant le temps de générer la table arc-en-ciel. Si vous utilisez un sel pour chaque mot de passe, la table d'un sel est inutile pour un autre.

Et en utilisant plus d'un hash aura aidé ici? Non. La personne générant une attaque arc-en-ciel spécifique sera capable de la générer en utilisant un ou plusieurs hashes, de toute façon.

Et utiliser plus d'un hash peut vous mener à un problème: c'est aussi sécurisé que le hash le plus faible que vous utilisez. Si quelqu'un trouve des collisions dans un algorithme de hachage, c'est ce hachage qui sera exploité, à tout moment du processus d'itération, pour casser le mot de passe. Donc, vous ne gagnez rien en utilisant plus d'algorithmes de hachage, il vaut mieux choisir un seul bon algo. et l'utiliser. Et si vous entendez dire qu'il a été cassé, réfléchissez à la façon dont vous allez le changer dans votre application.

Et pourquoi utiliser bcrypt ou quelque chose comme ça (vous dites que vous l'utilisez): parce que l'attaquant devra passer plus de temps à générer les tables. C’est pourquoi l’utilisation de MD5 + wait (3 secondes) n’aide pas: l’attaque sera hors ligne, de toute façon, afin que l’attaquant puisse générer les tables sans le (délai de 3 secondes).


2
Oops! Désolé, mon commentaire (concernant le fait de rendre délibérément le hash plus lent via le paramètre timeout) ne devait pas être pris au sérieux ... Je pense que j'ai trop lu Dilbert ces derniers temps.
FrustratedWithFormsDesigner

2
sha (sha (sha (...))) n'est pas plus sûr que sha. Si l'entropie de la fonction sha n'est pas maximale, c'est en fait moins sécurisé.
deadalnix

1
@deadalnix: il est important de mentionner que cela ne facilite pas la récupération du mot de passe d'origine, mais facilite la génération d'un mot de passe en collision, ce qui est tout ce qui est requis.
Bryan Boettcher

1
@deadalnix, j'ai lu ce commentaire dans la voix de Dale Gribble .
Jiggy

1
@deadalnix: l'objectif de sha (sha (sha ())) n'est pas et n'a jamais été d'ajouter plus d'entropie. Entropie est juste faite par l'utilisateur initial choisissant son mot de passe, tout le reste (hash, salt, etc.) est juste pour ralentir une attaque par force brute. Si quelqu'un parvient à obtenir votre base de données contenant les mots de passe, il obtiendra probablement le code utilisé pour hacher le mot de passe également, de sorte que tout sel codé en dur est également connu
woliveirajr

-1

Je crois comprendre que l’utilisation de plusieurs algorithmes de hachage consiste à vaincre les tables arc-en-ciel . Utiliser un bon sel marche aussi, mais je suppose que c'est un deuxième niveau de protection.


4
Cela ne change pas grand chose. La fonction de «hachage multiple» peut être vue comme une seule et traitée comme telle.
deadalnix

2
L'utilisation de techniques de hachage multiples ou d'itérations ne fait rien pour vaincre les tables arc-en-ciel. Si un attaquant a votre base de données et que la méthode utilisée pour générer les hachages est utilisée, il peut alors générer une table arc-en-ciel pour attaquer tous les mots de passe de la base de données. Les SALTS empêchent les attaques sur table arc-en-ciel, car ils empêchent l'attaquant de générer un dictionnaire de recherche unique pour attaquer, disons, tous les mots de passe de 8 caractères ou moins.
Erik

-1

Ce n'est pas plus sécurisé. Cependant, vous disposez d'un protocole d'identification basé sur le hachage plusieurs fois avec la même fonction.

Cela se passe comme ça. La valeur stockée est hash ^ n (pass) dans l'ordinateur A. A demande à B de s'authentifier et donne à B le nombre entier n. B fait le calcul hash ^ (n-1) (passe) et le renvoie à A.

Une vérification qui hash (hash ^ (n-1) (pass)) == hash ^ n (pass). Si c'est vrai, alors l'authentification est faite. Mais alors, un magasin hash ^ (n-1) (passe) et la prochaine authentification donnera B n-1 au lieu de n.

Cela garantit que le mot de passe n'est jamais échangé en clair, que A ne sait jamais ce que le mot de passe est et que l'authentification est protégée par la relecture. Cependant, cela a l'inconvénient d'exiger un mot de passe avec une durée de vie limitée. Lorsque n atteint la valeur 2, un nouveau mot de passe doit être choisi après authentification.

L'outil HMAC est une autre utilisation du hachage multiple, qui garantit l'authentification et l'intégrité d'une requête. Pour plus d'informations sur HMAC, voir http://en.wikipedia.org/wiki/HMAC .

La plupart des utilisations de hachage multiple dans le monde réel sont excessives. Dans votre cas, cela semble être le cas. Notez que si vous utilisez plusieurs fonctions de hachage, elles n'auront pas toutes la même entropie, ce qui réduira la force de hachage. Par exemple, md5 a moins d'entropie que sha1, donc utiliser sha1 sur un md5 n'améliorera pas la force du hachage. La force sera généralement égale à la force de la fonction de hachage plus faible.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.