Comme beaucoup le savent, le cryptage unidirectionnel est un moyen pratique de crypter les mots de passe des utilisateurs dans les bases de données. De cette façon, même l'administrateur de la base de données ne peut pas connaître le mot de passe d'un utilisateur, mais devra faire une supposition de mot de passe, le chiffrer avec le même algorithme, puis comparer le résultat avec le mot de passe chiffré dans la base de données. Cela signifie que le processus de détermination du mot de passe nécessite des quantités massives de suppositions et beaucoup de puissance de traitement.
Voyant que les ordinateurs continuent de s'accélérer et que les mathématiciens développent toujours ces algorithmes, je me demande lequel est le plus sûr compte tenu de la puissance de calcul moderne et des techniques de cryptage.
J'utilise MD5 presque exclusivement depuis des années maintenant, et je me demande s'il y a quelque chose de plus que je devrais faire. Dois-je envisager un algorithme différent?
Une autre question connexe: combien de temps un champ doit-il normalement contenir pour un tel mot de passe crypté? Je dois admettre que je ne sais pratiquement rien sur le cryptage, mais je suppose qu'un hachage MD5 (à titre d'exemple) peut être plus long et prendrait probablement plus de puissance de traitement pour se fissurer. Ou la longueur du champ n'a-t-elle pas d'importance du tout, à condition que le mot de passe crypté y tienne en premier lieu?
Avertissement: Depuis que cet article a été écrit en 2010, les GPU ont été largement déployés pour hacher les mots de passe par force brute. Les GPU à prix modéré peuvent exécuter dix milliards MD5 par seconde. Cela signifie que même un mot de passe alphanumérique à 8 caractères complètement aléatoire (62 caractères possibles) peut être forcé brutalement en 6 heures. SHA-1 n'est que légèrement plus lent, cela prendrait un jour. Les mots de passe de vos utilisateurs sont beaucoup plus faibles et (même avec le salage) chuteront à un taux de milliers de mots de passe par seconde. Les fonctions de hachage sont conçues pour être rapides. Vous ne voulez pas cela pour les mots de passe. Utilisez scrypt, bcrypt ou PBKDF-2.
MD5 s'est avéré faible en 1996 et ne devrait plus être utilisé à des fins cryptographiques. SHA-1 est un remplacement couramment utilisé, mais a des problèmes similaires . La famille SHA-2 des fonctions de hachage est l'actuelle remplacement de SHA-1. Les membres de SHA-2 sont appelés individuellement SHA-224, SHA-256, SHA-384 et SHA-512.
À l'heure actuelle, plusieurs fonctions de hachage sont en concurrence pour devenir SHA-3 , le prochain algorithme de hachage cryptographique normalisé. Un gagnant sera choisi en 2012. Aucun de ceux-ci ne devrait encore être utilisé!
Pour le hachage de mot de passe , vous pouvez également envisager d'utiliser quelque chose comme bcrypt . Il est conçu pour être suffisamment lent pour rendre les attaques par force brute à grande échelle irréalisables. Vous pouvez régler vous-même la lenteur, de sorte qu'elle peut être ralentie lorsque les ordinateurs deviennent plus rapides.
Avertissement: bcrypt est basé sur un algorithme de cryptage bidirectionnel plus ancien, Blowfish, pour lequel de meilleures alternatives existent aujourd'hui. Je ne pense pas que les propriétés de hachage cryptographique de bcrypt soient complètement comprises. Quelqu'un me corrige si je me trompe; Je n'ai jamais trouvé de source fiable qui discute des propriétés de bcrypt (autres que sa lenteur) d'un point de vue cryptographique.
Il peut être quelque peu rassurant que le risque de collision importe moins pour le hachage de mot de passe que pour la cryptographie à clé publique ou les signatures numériques. L'utilisation de MD5 aujourd'hui est une idée terrible pour SSL, mais pas tout aussi désastreuse pour le hachage de mot de passe. Mais si vous avez le choix, choisissez simplement un plus fort.
Utiliser une bonne fonction de hachage est pas assez pour sécuriser vos mots de passe. Vous devez hacher les mots de passe avec sels longs et aléatoires cryptographiquement . Vous devriez également aider vos utilisateurs à choisir des mots de passe ou des phrases de passe plus forts si possible. Plus c'est toujours mieux.
Grande question! Cette page est une bonne lecture. En particulier, l'auteur affirme que MD5 n'est pas approprié pour hacher des mots de passe:
Le problème est que MD5 est rapide. Ses concurrents modernes, comme SHA1 et SHA256. La vitesse est un objectif de conception d'un hachage sécurisé moderne, car les hachages sont un élément constitutif de presque tous les cryptosystèmes et sont généralement exécutés à la demande par paquet ou par message.
La vitesse est exactement ce que vous ne voulez pas dans une fonction de hachage de mot de passe.
L'article continue ensuite à expliquer certaines alternatives et recommande Bcrypt comme le "bon choix" (ses mots, pas les miens).
Avertissement: je n'ai pas essayé du tout Bcrypt. Considérez ceci comme une recommandation amicale mais pas quelque chose que je peux sauvegarder avec ma propre expérience technique.
Pour augmenter la force du mot de passe, vous devez utiliser une plus grande variété de symboles. Si vous avez 8-10 caractères dans le mot de passe, il devient assez difficile à déchiffrer. Bien que l'allonger le rendra plus sûr, uniquement si vous utilisez des caractères numériques/alphabétiques/autres.
SHA1 est un autre algorithme de hachage (cryptage unidirectionnel), il est plus lent, mais a un résumé plus long. (message codé) (160 bits) où MD5 n'a que 128 bits.
Ensuite, SHA2 est encore plus sécurisé, mais il a utilisé moins.
Voyant que les ordinateurs continuent de s'accélérer et que les mathématiciens développent encore ces algorithmes
Le chiffrement RSA est sécurisé dans la mesure où il repose sur un très grand nombre difficile à prendre en compte. Finalement, les ordinateurs seront suffisamment rapides pour prendre en compte le nombre dans un délai raisonnable. Pour garder une longueur d'avance, vous utilisez un nombre plus élevé.
Cependant, pour la plupart des sites Web, le hachage des mots de passe a pour but de rendre incommode pour une personne ayant accès à la base de données pour lire le mot de passe, pas pour assurer la sécurité. À cet effet, MD5 est très bien1.
L'implication ici est que si un utilisateur malveillant accède à l'intégralité de votre base de données, il n'a pas besoin du mot de passe. (Le verrou de la porte d'entrée ne m'empêchera pas d'entrer dans la fenêtre.)
1 Ce n'est pas parce que MD5 est "cassé" que vous pouvez simplement l'inverser quand vous le souhaitez.
saler le mot de passe est toujours un niveau de défense supplémentaire
$salt = 'asfasdfasdf0a8sdflkjasdfapsdufp';
$hashed = md5( $userPassword . $salt );
En plus d'être une fonction unidirectionnelle sécurisée cryptographiquement, une bonne fonction de hachage pour la protection par mot de passe devrait être difficile à utiliser brutalement - c'est-à-dire lente par conception. scrypt est l'un des meilleurs dans ce domaine. Depuis la page d'accueil:
Nous estimons que sur du matériel moderne (2009), si 5 secondes sont consacrées au calcul d'une clé dérivée, le coût d'une attaque matérielle par force brute contre scrypt est environ 4000 fois supérieur au coût d'une attaque similaire contre bcrypt (pour trouver la même chose). mot de passe) et 20000 fois supérieur à une attaque similaire contre PBKDF2.
Cela dit, à partir des fonctions de hachage couramment disponibles, faire quelques milliers d'itérations de quoi que ce soit de la famille SHA est une protection assez raisonnable pour les mots de passe non critiques.
De plus, ajoutez toujours un sel pour qu'il soit impossible de partager les efforts pour forcer brutalement plusieurs hachages à la fois.
Le NIST lance actuellement un concours pour sélectionner un nouvel algorithme de hachage, tout comme il l'a fait pour sélectionner l'algorithme de chiffrement AES. La réponse à cette question sera donc probablement différente dans quelques années.
Vous pouvez rechercher les soumissions et les étudier par vous-même pour voir s'il y en a une que vous souhaitez utiliser.