Différence entre le hachage d'un mot de passe et le chiffrement


140

L'actuel le plus voté à cette question déclare:

Un autre problème qui n'est pas tellement un problème de sécurité, bien qu'il soit lié à la sécurité, est l'échec complet et abject à faire la différence entre le hachage d'un mot de passe et le chiffrement . Le plus souvent trouvé dans le code où le programmeur essaie de fournir une fonctionnalité non sécurisée «Me rappeler mon mot de passe».

Quelle est exactement cette différence? J'ai toujours eu l'impression que le hachage était une forme de cryptage. À quelle fonctionnalité dangereuse l'affiche fait-elle référence?


Un article bien écrit expliquant pourquoi vous ne devriez pas simplement hacher vos secrets / mots de passe. Utilisez plutôt HMAC. benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

Excellent résumé du sujet sur le blog de sécurité StackExchange: security.blogoverflow.com/2011/11/…
David J. Liszewski

@JayKumar: L'article que vous avez lié est très trompeur. Il confond les sels de mot de passe (qui devraient être visibles pour les attaquants) avec les clés MAC (qui devraient rester secrètes). Le lien de David J. Liszewski fournit une description beaucoup plus précise.
Rufflewind

Réponses:


222

Le hachage est une fonction à sens unique (enfin, un mappage). C'est irréversible, vous appliquez l'algorithme de hachage sécurisé et vous ne pouvez pas récupérer la chaîne d'origine. Tout ce que vous pouvez faire est de générer ce que l'on appelle «une collision», c'est-à-dire de trouver une chaîne différente qui fournit le même hachage. Les algorithmes de hachage cryptographiquement sécurisés sont conçus pour empêcher l'apparition de collisions. Vous pouvez attaquer un hachage sécurisé en utilisant une table arc-en-ciel , que vous pouvez contrebalancer en appliquant un sel au hachage avant de le stocker.

Le chiffrement est une fonction appropriée (bidirectionnelle). C'est réversible, vous pouvez décrypter la chaîne mutilée pour obtenir la chaîne d'origine si vous avez la clé.

La fonctionnalité dangereuse à laquelle il fait référence est que si vous cryptez les mots de passe, votre application a la clé stockée quelque part et un attaquant qui a accès à votre base de données (et / ou au code) peut obtenir les mots de passe d'origine en obtenant à la fois la clé et le texte crypté , alors qu'avec un hachage c'est impossible.

Les gens disent généralement que si un pirate possède votre base de données ou votre code, il n'a pas besoin d'un mot de passe, la différence est donc sans objet. C'est naïf, car vous avez toujours le devoir de protéger les mots de passe de vos utilisateurs, principalement parce que la plupart d'entre eux utilisent le même mot de passe encore et encore, les exposant à un plus grand risque en divulguant leurs mots de passe.


1
Pour être clair, obtenez la sécurité souhaitée avec le hachage, il doit s'agir d'un algorithme de hachage cryptographiquement sécurisé avec la propriété spécifique que non seulement le hachage est non réversible, MAIS AUSSI impraticable en calcul pour générer TOUTE autre chaîne qui génère le même hachage.
Tall Jeff

11
Oui et non ... Les collisions de hachage doivent être difficiles à générer pour la sécurité de votre propre application, mais la non-réversibilité est suffisante pour éviter les fuites de mots de passe.
Dave Sherohman

5
soyeux: et comment allez-vous récupérer le mot de passe d'origine de votre mauvaise fonction de hachage? Je vous suggère de relire le commentaire de Dave
Vinko Vrsalovic

1
Si quoi que ce soit, une fonction de hachage qui a un grand nombre de collisions est meilleure pour la sécurité des mots de passe, mais cela signifierait évidemment que plus de mots de passe pourraient être utilisés pour se connecter au compte.
williamvicary

1
Le sel @ n00b ne peut pas être codé en dur car chaque élément haché doit utiliser un sel séparé. Le point d'un sel est si à la fois UserA et UserB utilise le mot de passe "1234" si vous découvrez le mot de passe de UserA, vous ne pouvez pas dire à UserB utilisé le même mot de passe parce qu'ils avaient des sels différents. Il n'est pas essentiel pour la sécurité qu'un sel soit gardé secret, la plupart des implémentations concaténent simplement le sel à l'avant ou à l'arrière de la goutte binaire qui représente le hachage.
Scott Chamberlain

34

Le hachage est une fonction à sens unique, ce qui signifie qu'une fois que vous avez haché un mot de passe, il est très difficile de récupérer le mot de passe d'origine du hachage. Le cryptage est une fonction bidirectionnelle, où il est beaucoup plus facile de récupérer le texte d'origine à partir du texte crypté.

Le hachage simple est facilement vaincu à l'aide d'une attaque par dictionnaire, où un attaquant pré-hache simplement chaque mot d'un dictionnaire (ou chaque combinaison de caractères jusqu'à une certaine longueur), puis utilise ce nouveau dictionnaire pour rechercher des mots de passe hachés. L'utilisation d'un sel aléatoire unique pour chaque mot de passe haché stocké rend beaucoup plus difficile pour un attaquant d'utiliser cette méthode. Ils auraient essentiellement besoin de créer un nouveau dictionnaire unique pour chaque valeur de sel que vous utilisez, ce qui ralentirait terriblement leur attaque.

Il n'est pas sûr de stocker des mots de passe à l'aide d'un algorithme de chiffrement car s'il est plus facile pour l'utilisateur ou l'administrateur de récupérer le mot de passe d'origine à partir du texte chiffré, il est également plus facile pour un attaquant de faire de même.


13

Mots de passe cryptés vs hachés

Comme le montre l'image ci-dessus, si le mot de passe est crypté, il s'agit toujours d'un secret caché où quelqu'un peut extraire le mot de passe en texte brut. Cependant, lorsque le mot de passe est haché, vous êtes détendu car il n'y a pratiquement aucune méthode pour récupérer le mot de passe à partir de la valeur de hachage.


Extrait de mots de passe cryptés vs hachés - Quel est le meilleur?

Le cryptage est-il bon?

Les mots de passe en texte brut peuvent être cryptés à l'aide d'algorithmes de cryptage symétriques tels que DES, AES ou avec tout autre algorithme et être stockés dans la base de données. Lors de l'authentification (confirmant l'identité avec le nom d'utilisateur et le mot de passe), l'application déchiffrera le mot de passe crypté stocké dans la base de données et comparera avec le mot de passe fourni par l'utilisateur pour l'égalité. Dans ce type d'approche de gestion des mots de passe, même si quelqu'un a accès aux tables de la base de données, les mots de passe ne seront pas simplement réutilisables. Cependant, il y a aussi une mauvaise nouvelle dans cette approche. Si quelqu'un obtient d'une manière ou d'une autre l'algorithme cryptographique avec la clé utilisée par votre application, il pourra voir tous les mots de passe utilisateur stockés dans votre base de données par décryptage. «C'est la meilleure option que j'ai», peut crier un développeur de logiciel, mais y a-t-il une meilleure solution?

Fonction de hachage cryptographique (unidirectionnelle uniquement)

Oui, il est possible que vous ayez manqué le point ici. Avez-vous remarqué qu'il n'est pas nécessaire de déchiffrer et de comparer? S'il y a une approche de conversion à sens unique où le mot de passe peut être converti en un mot converti, mais l'opération inverse (génération du mot de passe à partir du mot converti) est impossible. Maintenant, même si quelqu'un accède à la base de données, il n'y a aucun moyen que les mots de passe soient reproduits ou extraits à l'aide des mots convertis. Dans cette approche, il est pratiquement impossible que certains connaissent les mots de passe top secrets de vos utilisateurs; et cela protégera les utilisateurs utilisant le même mot de passe dans plusieurs applications. Quels algorithmes peuvent être utilisés pour cette approche?


D'accord, mais lorsque vous vous connectez à un service, votre mot de passe est envoyé en texte clair / chiffré, car s'il est envoyé sous forme de hachage au serveur pour être comparé. un pirate pourrait, s'il connaît le hachage, envoyer simplement le hachage au serveur pour se connecter. C'est pourquoi les mots de passe de comparaison doivent être envoyés cryptés au serveur, où ils sont décryptés et hachés. C'est sûr, non? Tant que les mots de passe ne sont jamais stockés sous forme non hachée à long terme et que toutes les occurrences de mots de passe cryptés / en clair sont effacées de n'importe quelle mémoire lorsqu'elles ne sont plus nécessaires?
AgentM

8

J'ai toujours pensé que le chiffrement pouvait être converti dans les deux sens, de manière à ce que la valeur finale puisse vous ramener à la valeur d'origine et avec le hachage, vous ne pourrez pas revenir du résultat final à la valeur d'origine.


8

Les algorithmes de hachage sont généralement de nature cryptographique, mais la principale différence est que le chiffrement est réversible par déchiffrement, et le hachage ne l'est pas.

Une fonction de cryptage prend généralement des entrées et produit une sortie cryptée de même taille ou légèrement supérieure.

Une fonction de hachage prend une entrée et produit une sortie généralement plus petite, généralement d'une taille fixe également.

Bien qu'il ne soit pas possible de prendre un résultat haché et de le «déshacher» pour récupérer l'entrée d'origine, vous pouvez typiquement forcer votre chemin vers quelque chose qui produit le même hachage.

En d'autres termes, si un schéma d'authentification prend un mot de passe, le hache et le compare à une version hachée du mot de passe requis, il n'est peut-être pas nécessaire que vous connaissiez réellement le mot de passe d'origine, uniquement son hachage, et vous pouvez force brute votre chemin vers quelque chose qui correspondra, même s'il s'agit d'un mot de passe différent.

Les fonctions de hachage sont généralement créées pour minimiser les risques de collisions et rendre difficile le calcul de quelque chose qui produira le même hachage que quelque chose d'autre.


4

Idéalement, vous devriez faire les deux.

Hachez d'abord le mot de passe pour la sécurité à sens unique. Utilisez un sel pour plus de sécurité.

Ensuite, cryptez le hachage pour vous protéger contre les attaques de dictionnaire si votre base de données de hachages de mots de passe est compromise.


3
Cryptez-le avec quoi? S'ils vous ont poussé si fort qu'ils ont accédé à la base de données avec tous les mots de passe de vos utilisateurs (hachés, chiffrés ou autres), ne pourraient-ils pas trouver la clé pour les déchiffrer?
Luc

5
Cela ne devrait pas être critiqué. C'est une possibilité qui ne devrait pas être exclue si facilement, que la base de données soit compromise alors que l'application ne l'est pas. Par conséquent, le chiffrement du hachage est une couche de sécurité supplémentaire.
Arie

@Luc je ne suis pas d'accord avec toi, mon ancien moi. J'ai vu trop d'injections SQL qui n'ont pas compromis le code de l'application (ou les fichiers de configuration) et je suis maintenant d'avis que l' ajout d' un secret est utile, que ce soit sous forme de cryptage ou sous la forme d'un poivre, mais il ne doit pas remplacer le hachage. Pour une réponse plus complète, voir ici: security.stackexchange.com/a/31846/10863
Luc

3

Hashing :

C'est un algorithme à sens unique et une fois haché, il ne peut pas revenir en arrière et c'est son avantage contre le cryptage.

Chiffrement

Si nous effectuons un cryptage, il y aura une clé pour le faire. Si cette clé devait être divulguée, tous vos mots de passe pourraient être décryptés facilement.

D'un autre côté, même si votre base de données sera piratée ou si l'administrateur de votre serveur a pris des données de DB et que vous avez utilisé des mots de passe hachés, le pirate ne pourra pas casser ces mots de passe hachés. Cela serait en fait pratiquement impossible si nous utilisons le hachage avec du sel approprié et une sécurité supplémentaire avec PBKDF2.

Si vous voulez voir comment écrire vos fonctions de hachage, vous pouvez visiter ici .

Il existe de nombreux algorithmes pour effectuer le hachage.

  1. MD5 - Utilise la fonction de hachage Message Digest Algorithm 5 (MD5). Le hachage de sortie a une longueur de 128 bits. L'algorithme MD5 a été conçu par Ron Rivest au début des années 1990 et n'est pas une option privilégiée aujourd'hui.

  2. SHA1 - Utilise le hachage de l'algorithme de hachage de sécurité (SHA1) publié en 1995. Le hachage de sortie a une longueur de 160 bits. Bien que la plus largement utilisée, ce n'est pas une option préférée aujourd'hui.

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 - Utilisez les fonctions SHA-256, SHA-384 et SHA-512 de la famille SHA-2. SHA-2 a été publié en 2001. Les longueurs de hachage de sortie sont respectivement de 256, 384 et 512 bits, comme l'indiquent les noms des fonctions de hachage.


1

Aussi correctes que puissent être les autres réponses, dans le contexte de la citation, le hachage est un outil qui peut être utilisé pour sécuriser les informations, le cryptage est un processus qui prend des informations et rend très difficile la lecture / l'utilisation par des personnes non autorisées.


-9

Voici une raison pour laquelle vous voudrez peut-être utiliser l'un sur l'autre: la récupération du mot de passe.

Si vous ne stockez qu'un hachage du mot de passe d'un utilisateur, vous ne pouvez pas proposer une fonction de «mot de passe oublié».


16
Vous n'avez manifestement pas assez bien lu la réponse acceptée. Lisez attentivement: vous n'êtes pas censé proposer une fonction de récupération de mot de passe . Vous êtes censé offrir une fonction de réinitialisation de mot de passe . J'ai administré de nombreux sites Web pendant des années, notamment vBulletin, phpBB, e107, IPB, blogspot et même mon propre CMS personnalisé. En tant qu'administrateur, vous n'avez JAMAIS besoin du mot de passe pré-haché de quelqu'un. Vous ne le faites pas. Et vous ne devriez pas l'avoir non plus. Si vous n'êtes pas d'accord avec ce que je dis, laissez-moi vous assurer: vous vous trompez.
Lakey

3
Désolé d'être trop en colère. Je vois juste trop de sites Web stocker des mots de passe en texte brut et cela me frustre. En passant, certains sites Web axés sur la sécurité aiment faire changer périodiquement leurs mots de passe par les utilisateurs. Ils veulent s'assurer que la personne ne change pas son mot de passe de «Password1» à «Password2». Ils conservent donc le mot de passe en texte brut afin de faire ces comparaisons à une date ultérieure. Ce n’est pas une bonne pratique. Ce qu'ils doivent faire, dans ce cas, est d'effectuer une analyse sur le mot de passe EN PREMIER, en créant un tas de mots de passe similaires - hachage chacun - et ne stocker que les hachages .
Lakey

7
Pas de problème, cela m'a fait revenir en arrière et relire la question et aussi faire des recherches supplémentaires, donc tout n'est pas perdu :-) Je ne suis pas sûr de ce que je pensais quand j'ai écrit cette réponse. cheers
Philtron
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.