Je m'intéresse à la sécurité de l'information. J'ai récemment découvert l'idée du hachage. Ce que je comprends actuellement du hachage, c'est qu'il faut le mot de passe entré par un utilisateur. Ensuite, il génère aléatoirement un "hachage" en utilisant un tas de variables et en brouillant tout. Ensuite, lorsque vous entrez ce mot de passe pour vous connecter, il correspond à ce mot de passe au hachage. Il y a juste deux ou trois choses que je ne comprends pas.
Pourquoi est-il si difficile de casser ces hachages? Je suppose qu'une fois que vous avez trouvé la méthode qu'ils utilisent pour la crypter (allons-y avec une méthode extrêmement simple comme le chiffre de César une fois que vous avez découvert combien vous devez déplacer, vous pouvez le faire pour des livres entiers). Même s'il utilise quelque chose comme le temps et le mélange, il existe de très grandes façons de limiter les options (permet d'utiliser le chiffre César, ils utilisent l'année mod x, vous savez déjà qu'il y a deux années possibles de manière réaliste, alors vous n'avez qu'à comprendre la deuxième pièce du puzzle).
S'ils sont générés de manière aléatoire (même si deux mots de passe sont identiques, ils sortent différemment) comment peuvent-ils savoir si c'est correct?
Comment sont-ils fissurés. Comment hash cat sait-il qu'il a réussi à déchiffrer le mot de passe?
Vidéo connexe (mais ne répond pas exactement à ma question): https://www.youtube.com/watch?v=b4b8ktEV4Bg
Rapide, facteur 1081.
Ou si vous préférez, répondez à ceci: qu'est-ce que 23 fois 47?
Laquelle est la plus facile? Il est plus facile d'effectuer une multiplication (il suffit de suivre les règles mécaniquement) que de récupérer les opérandes en fonction du produit uniquement. Multiplication. (Soit dit en passant, c'est le fondement de certains algorithmes cryptographiques tels que RSA .)
Les fonctions de hachage cryptographique ont des fondements mathématiques différents, mais elles ont la même propriété: elles sont faciles à calculer à l'avenir (calculer H(x) étant donné x), mais pratiquement impossible à calculer en reculant (étant donné y, calculer x tel que H(x) = y). En fait, l'un des signes d'une bonne fonction de hachage cryptographique est qu'il n'y a pas de meilleure façon de trouver x que de les essayer tous et de calculer H(x) jusqu'à ce que vous trouviez une correspondance.
Une autre propriété importante des fonctions de hachage est que deux entrées différentes ont des hachages différents. Donc, si H (x1) = H (x2), nous pouvons conclure que x1 = x2. Mathématiquement parlant, cela est impossible - si les entrées sont plus longues que la longueur du hachage, il doit y avoir des collisions. Mais avec une bonne fonction de hachage cryptographique, il n'y a aucun moyen connu de trouver une collision avec toutes les ressources informatiques du monde.
Si vous voulez en savoir plus sur les fonctions hachage cryptographique , lisez cette réponse de Thomas Pornin . Allez, je vais attendre.
Notez qu'une fonction de hachage n'est pas une fonction de cryptage. Le chiffrement implique que vous pouvez déchiffrer (si vous connaissez la clé). Avec un hachage, il n'y a pas de nombre magique qui vous permet de revenir en arrière.
Les principales fonctions de hachage cryptographique recommandées sont SHA-1 et la famille SHA-2 (qui existe en plusieurs tailles de sortie, principalement SHA-256 et SHA-512). MD5 est un ancien, désormais obsolète car il a connu des collisions. En fin de compte, il n'y a aucune preuve mathématique qu'il s'agit bien de bonnes fonctions de hachage cryptographique, seulement une croyance répandue car de nombreux cryptographes professionnels ont passé des années de leur vie à essayer, et à défaut, de les briser.
Ok, c'est une partie de l'histoire. Désormais, un hachage de mot de passe n'est pas directement une fonction de hachage cryptographique. Une fonction de hachage de mot de passe (PHF) prend deux entrées: le mot de passe et un sel. Le sel est généré de manière aléatoire lorsque l'utilisateur choisit son mot de passe, et il est stocké avec le mot de passe haché PHF (mot de passe, sel). (Ce qui importe, c'est que deux comptes différents ont toujours des sels différents, et générer aléatoirement un sel suffisamment grand est un bon moyen d'avoir cette propriété avec une probabilité écrasante.) Lorsque l'utilisateur se connecte à nouveau, le système de vérification lit le sel de la base de données de mots de passe , calcule PHF (mot de passe, sel) et vérifie que le résultat est bien ce qui est stocké dans la base de données.
Le point essentiel est que si quelqu'un veut déchiffrer un mot de passe, il devra connaître le hachage avant de pouvoir commencer , et il devra attaquer chaque compte séparément. Le sel rend impossible d'effectuer à l'avance de nombreux travaux de craquage, par ex. en générant un Rainbow table .
Cela répond (2) et (3) - le vérificateur légitime et l'attaquant découvrent de la même manière si le mot de passe (saisi par l'utilisateur, ou deviné par l'attaquant) est correct. Un dernier point dans l'histoire: une bonne fonction de hachage de mot de passe a une propriété supplémentaire, elle doit être lente. Le serveur légitime n'a besoin de le calculer qu'une seule fois par tentative de connexion, tandis qu'un attaquant doit le calculer une fois par devinette, de sorte que la lenteur blesse davantage l'attaquant (ce qui est nécessaire, car l'attaquant possède généralement plus de matériel spécialisé).
Si jamais vous avez besoin de hacher des mots de passe, n'inventez pas votre propre méthode . tilisez l'une des méthodes standard : scrypt , bcrypt ou PBKDF2 .
Fonctions de hachage cryptographiques sont des objets mathématiques qui peuvent être décrits comme "un grand mélange et brouillage de certains bits". Ils prennent en entrée une séquence de bits (éventuellement très longue) et offrent une sortie de taille fixe. En gros, ils sont tellement enchevêtrés que même s'ils n'ont rien de secret (c'est juste du code déterministe), personne ne peut comprendre comment les "inverser" (trouver une entrée correspondante pour une sortie donnée) sauf par la méthode de base appelée "chance" ": essayez des entrées aléatoires jusqu'à ce qu'une correspondance soit trouvée.
Comment il peut arriver, scientifiquement, que des fonctions de hachage puissent exister du tout est ne bonne question .
Le hachage n'est pas un chiffrement . Il n'y a pas de secret, pas de clé dans le hachage.
Les fonctions de hachage ont de nombreuses utilisations; l'un d'eux est le "stockage des mots de passe". Une fonction de hachage semble être une bonne chose pour le stockage de mots de passe. Nous ne voulons pas stocker directement les mots de passe (sinon un coup d'œil occasionnel à nos bases de données par l'attaquant lui donnerait trop d'informations; voir ceci article de blog pour une discussion); nous voulons stocker jetons de vérification de mot de passe: quelque chose qui permet la vérification d'un mot de passe (que l'utilisateur présente) mais ne révèle pas le mot de passe lui-même. L'idée est donc: stockons le hachage du mot de passe. Lorsqu'un mot de passe doit être vérifié, nous calculons simplement son hachage et voyons s'il correspond à la valeur stockée. Mais il est difficile de deviner le mot de passe à partir de la valeur de hachage, car la fonction de hachage résiste à "l'inversion" (voir ci-dessus).
Étant donné que les mots de passe sont un type spécial de données (ce sont des données dont les humains peuvent se souvenir), pour une sécurité adéquate, nous avons besoin d'une fonction de hachage "renforcée":
Voir cette réponse pour un traitement approfondi du sujet du hachage des mots de passe.
Le hachage est une fonction d'une chaîne de bits (généralement de longueur variable) vers une autre chaîne de bits (généralement plus petite et de longueur fixe).
Le hachage est utilisé dans les bases de données pour la récupération des données et dans les structures de données en mémoire appelées tables de hachage. Il nous permet de réduire des données arbitraires, telles qu'une chaîne de caractères ou un objet compliqué avec de nombreux champs, en un nombre binaire qui peut ensuite être utilisé directement comme index dans un tableau clairsemé pour récupérer les données associées (avec quelques détails pour gérer le hachage collisions).
Les fonctions de hachage utilisées de la manière ci-dessus sont des "cousins" des fonctions de hachage cryptographiques. Ils sont conçus pour différentes exigences. Ils doivent être rapides à calculer et obtenir une bonne distribution.
Dans l'informatique sécurisée, les hachages cryptographiques sont utilisés pour digérer les données dans une petite chaîne de bits représentative. Les fonctions cryptographiques ont des exigences différentes. Ils sont conçus pour être difficiles à inverser (pour être des fonctions de "trappe" ou "à sens unique"). Non seulement cela, mais une exigence importante est qu'il doit être difficile de trouver, pour un texte en clair et une valeur de hachage donnés, un autre texte en clair qui produit le même hachage.
Le hachage peut être utilisé non seulement pour les mots de passe, mais comme somme de contrôle pour vérifier l'intégrité des données et dans le cadre de la mise en œuvre des signatures numériques. Pour signer numériquement un grand document, il suffit de hacher le document pour produire un "résumé" (un nom utilisé pour la sortie d'une fonction de hachage, quand quelque chose de très long est haché). Ensuite, ce résumé est mis à travers le système cryptographique à clé publique pour produire une signature. Vous pouvez y voir la faiblesse: que faire si un attaquant réussit à produire un document qui a le même condensé? Il semble alors que la signature originale produite sur le document authentique soit en fait la signature d'un document contrefait: une contrefaçon de transplantation de signature a été effectivement perpétrée.
Le hachage de mot de passe permet aux systèmes de ne pas stocker la version en texte brut d'un mot de passe, tout en leur permettant de vérifier si l'utilisateur tentant d'accéder à l'entrée connaît ce mot de passe. Non seulement le hachage permet aux systèmes de ne pas stocker les mots de passe en texte brut (qui devraient être très soigneusement gardés), mais il permet également que même si les hachages sont exposés publiquement, les mots de passe sont toujours sécurisés (de la même manière que la cryptographie à clé publique systèmes peuvent révéler des clés publiques). Bien que dans la pratique, les hachages soient néanmoins protégés de l'accès public: par exemple /etc/shadow
des fichiers sur des systèmes de type Unix, complétant la lecture du monde /etc/passwd
des dossiers.
La fonction de hachage est tout sauf aléatoire. Cependant, la randomisation est utilisée pour contrecarrer les attaquants qui créent de grands dictionnaires de mots de passe et de hachage, qui leur permettent de rechercher un code de hachage et de récupérer le mot de passe correspondant.
Pour hacher un mot de passe de manière plus sécurisée, nous pouvons simplement lui ajouter des bits aléatoires appelés "sel". Différents sels ajoutés au même mot de passe, bien sûr, conduisent à des hachages différents (espérons-le avec peu ou pas de collisions).
Si le sel aléatoire a, par exemple, une largeur de 32 bits, cela signifie qu'en théorie, un mot de passe peut hacher de plus de quatre milliards de façons différentes, ce qui rend très peu pratique d'avoir un dictionnaire précalculé de tous les hachages possibles d'un grand nombre de mots de passe.
Bien sûr, lorsque l'utilisateur est authentifié, elle ne sait rien de ce sel. C'est correct car le sel est stocké avec le hachage dans le profil de l'utilisateur (souvent, combiné avec le hachage en une seule chaîne de bits compacte). Lorsque le mot de passe de l'utilisateur est en cours de validation, le sel est ajouté au mot de passe qu'il a entré, afin que le hachage soit effectué avec le sel correct. Si le mot de passe est correct, le hachage correspondra, car le sel utilisé est également le bon, ayant été retiré du profil de l'utilisateur.
C'est ainsi que l'aléatoire est incorporé dans le hachage de mot de passe, tout en lui permettant de fonctionner.
Ce qui rend les hachages difficiles à casser, c'est qu'ils sont construits à partir de fonctions de "trappe" ou "à sens unique". En mathématiques, il existe de nombreux exemples de telles choses. Par exemple, un simple ajout est une trappe. Si nous ajoutons des nombres entiers pour produire une somme, il est impossible de récupérer les nombres originaux, ne connaissant que la somme.
Les hachages de mot de passe ne sont pas des mots de passe chiffrés. Si un attaquant possède le hachage et le sel d'un mot de passe, et arrive à deviner le mot de passe, il peut facilement le confirmer, exactement de la même manière que le logiciel d'authentification de connexion le fait: il exécute le mot de passe plus le sel via la fonction de hachage et voit que le hachage correct émerge.
L'une des clés du hachage est qu'il jette des informations. Vous ne pouvez pas inverser un hachage car les connaissances nécessaires ont disparu. Voici quelques exemples de fonctions de hachage réalisables (mais assez inutiles). Si vous me donnez un mot de passe, je pourrais faire quelque chose comme l'un des suivants:
Dans chacun de ces cas, je ne peux pas inverser le processus. Au lieu de cela, je dois réexécuter le processus lorsque vous me donnerez le mot de passe plus tard pour voir si le calcul que j'ai exécuté correspond.
Par exemple: Si vous me donnez initialement le mot de passe "singe", je pourrais enregistrer le numéro 3 (3 voyelles). Puis, plus tard, lorsque j'essaie d'authentifier le mot de passe "dragon", j'exécute à nouveau ce même contrôle et j'obtiens 2, ce qui ne correspond pas à 3. Je sais donc que vous m'avez donné le mauvais mot de passe. Mais si vous me donnez le mot de passe "melissa", je suppose à tort que vous avez tapé le bon mot de passe. Il s'agit d'une collision de hachage .
L'ensemble de règles que vous appliquez pour arriver au nombre qui représente un mot de passe donné est votre fonction de hachage . Celles-ci sont considérées comme des fonctions "unidirectionnelles" car vous ne devriez pas pouvoir les inverser. Les fonctions de hachage de haute qualité sont conçues pour limiter le nombre de collisions potentielles, afin que vous n'ayez pas à vous soucier de ce problème. Un peu plus loin, les fonctions de hachage cryptographique sont conçues pour rendre difficile la création d'une chaîne qui pourrait correspondre à une sortie donnée (et peut-être créer intentionnellement des collisions) . Ils sont également conçus pour limiter la quantité d'informations que vous pouvez glaner sur une entrée donnée à partir de la sortie de hachage.
Par conséquent, la seule façon de savoir quel mot de passe correspond à un hachage cryptographique donné est d'essayer toutes les possibilités jusqu'à ce que vous tombiez sur celui qui fonctionne. D'autres contre-mesures (sel, BPKDF2, etc.) rendent ce processus de devinettes encore plus difficile en incitant la personne à deviner le mot de passe à travers plus de cerceaux pour chaque essai.
Notez que j'ai complètement ignoré comment une fonction de hachage cryptographique rend difficile la recherche d'un mot de passe fonctionnel (même s'il n'est pas celui d'origine). Cela s'appelle une " attaque de pré-image ". Dans l'exemple trivial ci-dessus, proposer "melissa" comme mot de passe candidat contenant 3 voyelles est un exemple d'une telle attaque.
Les fonctions de hachage cryptographique le font généralement en exécutant l'entrée à travers plusieurs "tours" d'un processus donné, où la sortie de chaque tour devient une partie de l'entrée du suivant. Pour comprendre l'entrée du premier tour, vous devez comprendre l'entrée du deuxième tour, ce qui à son tour vous oblige à comprendre l'entrée du troisième tour, etc., ce qui signifie que chaque supposition de chaque composant doit être vérifié à travers un ensemble de calculs longs et complexes. Thomas Pornin a une jolie explication exhaustive sur le fonctionnement de cette résistance; lecture assez utile si vous voulez vraiment le comprendre.
Déterminez la valeur constante de z satisfaisant cette équation: xy ^ 7 + yz ^ 5 + x ^ 3z = 0. Besoin d'aide? OK, x = 32. Vous ne pouvez toujours pas le résoudre? Ensuite, vous ne devriez pas connaître la réponse en premier lieu.
La valeur de y, qui réduira cela à une équation à variable unique, rendant la résolution de cette variable unique triviale pour toute élève de 6e (ayant éventuellement besoin d'une calculatrice), est un secret que je n'ai partagé qu'avec des personnes en qui j'ai confiance. Sans cela, z pourrait être n'importe quoi; sa valeur dépend de y et il ne peut donc pas être résolu de manière satisfaisante sans un y connu et constant. Si vous ne connaissez pas la valeur de y, c'est parce que je ne vous ai pas suffisamment fait confiance pour vous la donner en privé.
C'est le principe de base de la cryptographie; la formule mathématique ou un autre processus déterministe est bien documenté, et une ou plusieurs des variables possibles de la formule peuvent également être connues du public, permettant aux deux parties de s'entendre sur une manière de configurer leurs chiffres afin que chacun puisse décrypter ce que l'autre chiffre. Cependant, deux variables restent secrètes; si vous en connaissez un, vous pouvez découvrir l'autre. Celui que vous devez connaître est la clé, et celui que vous pouvez découvrir avec la clé est le message.
Pour un hachage, c'est un peu différent. Un hachage n'a pas besoin de garder un secret pour en garder un autre. Au lieu de cela, les hachages reposent sur une transformation mathématique irréversible; pour tout H(x) = y, il n'y a pas de H connu-1(y) = x sauf pour essayer H(x) pour tous les x possibles jusqu'à ce que vous obteniez y. Habituellement, cela est dû au fait que plusieurs résultats intermédiaires de l'équation sont ambigus; par exemple, calculer le carré La racine d'un nombre positif produit techniquement un résultat positif et négatif, car l'un ou l'autre nombre pourrait être multiplié par lui-même pour produire le résultat. L'inverse d'un module est également ambigu; le nombre 1, produit par x mod 3, aurait pu être produit par n'importe quel x = 3k + 1. Ces types de transformations "unidirectionnelles" sont combinés de telle manière que le calcul de la fonction de hachage inverse génère des possibilités infinies; la manière la plus simple (la plus simple) de les résoudre est donc d'essayer simplement entrée possible jusqu'à ce qu'une sortie corresponde. Cela prend encore beaucoup de temps.
Les hachages ne sont pas aléatoires. Comme je l'ai dit précédemment, les hachages sont le résultat d'une opération mathématique irréversible. Cette opération doit encore être déterministe; étant donné une entrée constante, la sortie est constante quel que soit le nombre de fois que vous effectuez l'opération. Il n'y a pas de composant aléatoire.
Là où vous pourriez avoir été confondu, c'est dans le terme de ce qu'un hachage simule, qui est un Oracle aléatoire. Imaginez une boîte noire, à l'intérieur de laquelle se trouve un petit homme avec une mémoire photographique et une méthode mystique pour générer des nombres parfaitement aléatoires. Vous écrivez quelque chose sur un morceau de papier et le poussez à travers une fente où l'homme l'obtient. Il le lit et l'une des deux choses se produit. Soit il ne l'a pas lu auparavant, auquel cas il va générer un nouveau nombre aléatoire et vous le donner, en validant à la fois votre message et le numéro dans sa mémoire. Ou bien, il a a lu ce message avant, auquel cas il se souvient du numéro qu'il a généré la première fois qu'il l'a lu et vous donne le numéro. Le générateur de nombres aléatoires ne générera jamais un nombre qu'il a déjà généré, il a une amplitude infinie possible et la mémoire du petit homme est illimitée et infaillible. Par conséquent, le petit homme ne pensera jamais avoir lu un message auparavant s'il ne l'a pas fait, n'oublie jamais qu'il a lu un message avant, et ne produira donc jamais, jamais, deux nombres différents pour le même message exact ni le même nombre pour deux différents messages.
C'est ce que les fonctions de hachage essaient de simuler. Ils ne peuvent pas modéliser ce petit homme avec la mémoire photographique, car cela nécessiterait un espace de stockage infini et une disponibilité universelle et illimitée, même sur des appareils qui ne sont connectés à aucun autre appareil d'une autre manière. Au lieu de cela, ils s'appuient sur un calcul déterministe mais aléatoire -à la recherche qui "digère" le message dans sa valeur de hachage. La même fonction de hachage, avec le même message, produira le même condensé; cependant, ces fonctions sont limitées dans le nombre de valeurs de hachage qu'elles sont autorisées à renvoyer. Cela crée la possibilité de ce que nous appelons les collisions de hachage; il y a plus de messages possibles que de valeurs de hachage, donc tôt ou tard (si tout va bien plus tard), deux messages différents produiront le même hachage.
Les hachages peuvent être fissurés pour trois raisons fondamentales. Premièrement, parce qu'ils sont une dérivation déterministe et mathématique de leur message, les mathématiciens (et donc les attaquants) finissent par trouver une relation mathématique entre un message et son hachage, ou entre deux messages et leurs hachages résultants. Ce qui était autrefois aléatoire ne l'est plus. Cela permettrait un certain nombre d'attaques en fonction de la nature de la faiblesse constatée; s'il existe un moyen algorithmique, étant donné un message et son hachage, de générer un message entrant en collision, c'est un problème. S'il existe un moyen de manipuler un message et de prédire le hachage résultant, c'est un problème différent. S'il existe en fait un moyen d'inverser le hachage, en produisant un message à partir du hachage qui, une fois re-haché, produit le même hachage, c'est un problème grave.
Deuxièmement, parce que les hachages ont une taille de résumé limitée, tôt ou tard, deux messages produiront le même hachage. Cela signifie qu'un attaquant n'a pas à trouver le message que vous utilisez pour produire un certain hachage; tout ce qu'il a à faire est de trouver a un message qui produit le même hachage. Les chances de cela sont minces, théoriquement une chance sur autant de hashs possibles, mais toujours mieux qu'une sur infini.
Enfin, alors qu'il y a beaucoup de messages possibles, il y a un nombre beaucoup plus petit de messages probable. Les messages que nous donnons généralement aux fonctions de hachage ont généralement une structure (basée sur la langue, le sujet, le formatage électronique et le but), ce qui signifie que, compte tenu d'une partie du message, nous pouvons deviner plus précisément d'autres parties du message. Cela signifie, en termes de science de l'information, que les messages qui sont convertis en hachages ont souvent moins entropie que la fonction de hachage elle-même; En clair, une fonction de hachage qui produit des résumés de 256 bits peut théoriquement produire n'importe quelle permutation de ces bits, 2 ^ 256. Cependant, s'il n'y a, par exemple, que 10 000 messages possibles qui pourraient être entrés dans cette fonction de hachage par un système étudié pour l'attaque, alors seulement 10 000 des 2 ^ 256 valeurs de hachage possibles seront jamais vues, et plus important encore, un l'attaquant n'aurait, dans le pire des cas, qu'à essayer les 10 000 entrées possibles pour trouver celle qui produit la valeur de hachage qu'il recherche.