web-dev-qa-db-fra.com

Algorithme de hachage de mot de passe le plus sécurisé?

Quel est/sont actuellement les algorithmes de hachage les plus sécurisés cryptographiquement? ( disponible en PHP )

La vitesse n'est pas pertinente, car j'itère le hachage sur une durée fixe (plutôt qu'un nombre fixe d'itérations). Ce qui m'intéresse, c'est la force mathématique.

Mon intuition me dit que c'est tourbillon , étant le plus grand et le plus lent du groupe. Ça ou SHA-512. Mais où sur le net puis-je voir ce que les experts recommandent?

41
Core Xii

Les cryptographes pourraient souligner que, lorsque vous lisez les petits caractères, rien ne prouve que des fonctions de hachage sécurisées existent réellement. La seule chose que nous avons maintenant est candidats pour laquelle aucune faiblesse n'a encore été trouvée.

Donc, le mieux que vous puissiez espérer est une fonction qui a longtemps survécu à l'examen de nombreux cryptographes. De plus, vous en avez besoin pour avoir une sortie suffisamment large (256 bits suffisent si vous souhaitez obtenir une "sécurité 128 bits" et aller au-delà de cela n'a pas de sens). À l'heure actuelle, depuis l'été 2011, cela indique SHA-256 ou SHA-512, pas Whirlpool.

Baser le nombre d'itérations sur le temps qu'il faut sur une machine typique est une bonne idée - mais le baser sur le temps qu'il vraiment prend votre la machine est pas une bonne idée. Sinon, vous pourriez vous retrouver avec un faible nombre d'itérations pour certains mots de passe car la machine traitait de nombreuses demandes à cet instant (une situation qu'un attaquant pourrait forcer, en passant). L'utilisation de nombreuses itérations est destinée à contrecarrer les attaquants en ralentissant le hachage des mots de passe sur l'attaquant ordinateur - le ralentir également sur votre système est un sous-produit malheureux; mais la véritable cible est la puissance de la machine que l'attaquant pourrait rassembler. Comme vous ne pouvez pas vraiment faire de repères sur la machine de l'attaquant, vous devez recourir à des estimations approximatives, donc à un nombre fixe, aussi élevé que possible tant que la charge moyenne est tolérable sur votre système (le mot important ici étant "moyen", ce qui disqualifie une mesure dynamique que vous avez l'intention d'effectuer).

De plus, la machine de l'attaquant n'a pas besoin de ressembler à la vôtre; il peut s'agir, par exemple, d'un GPU ou d'un FPGA , qui offre une informatique distincte capacités de ce que vous pouvez obtenir sur un serveur typique. Vous voulez une fonction pour laquelle un attaquant ne pourra pas obtenir d'énormes augmentations de performances en utilisant du matériel non PC. Là encore, cela favorise SHA-256 ou SHA-512, qui sont destinés à l'efficacité du processeur (avec des opérations arithmétiques 32 bits ou 64 bits), pas Whirlpool, qui peut bénéficier d'optimisations matérielles similaires à celles pour lesquelles AES a été conçu.

Enfin, les itérations ne sont qu'une partie du travail; vous avez également besoin d'un sel assez long et assez unique. Les itérations et le salage peuvent être un peu difficiles à faire en même temps; vous êtes vivement encouragé à utiliser une construction standard telle que PBKDF2 (bien qu'elle ait été conçue comme une fonction de dérivation de clé, et non comme un hacheur de mot de passe, PBKDF2 s'avère raisonnablement bon à cela aussi).

33
Thomas Pornin

Du commentaire de l'OP:

"Sécurisé" comme dans, basé sur un problème mathématique qui n'a pas de solution rapide connue. "Le plus sûr" comme dans, basé sur le plus complexe de ces problèmes. Un algorithme de hachage est considéré comme "fort" lorsque sa rupture nécessiterait une contribution majeure à la cryptologie/mathématiques.

Il semble que vous ayez lu "Assez avec les tables arc-en-ciel de Thomas Ptacek: ce que vous devez savoir sur les schémas de mots de passe sécurisés" , et maintenant vous vous demandez quel hachage cryptographique moderne optimisé pour le stockage des mots de passe est considéré comme "le plus sûr".

Je ne pense pas qu'il y ait de réponse claire. Pour autant que je sache, certains des favoris actuels de la communauté de programmation (scrypt et bcrypt) n'ont pas été rigoureusement examinés par les pairs en tant que fonctions de hachage de mot de passe. Au moins, ils n'ont pas été examinés par un grand nombre de cryptographes comparables à la façon dont les entrées de compétition de la fonction de hachage NIST sont vérifiées.

Cela dit, le consensus actuel de Hacker News est que la commande est:

  1. scrypt . Parce qu'il est à la fois gourmand en mémoire et en processeur, on pense que scrypt a la plus grande marge de sécurité des hachages de mots de passe actuels . Vous pouvez voir plus sur sa conception ici .
  2. bcrypt était le champion précédent, comme mentionné dans le blog de Thomas Ptacek ci-dessus .
  3. PBKDF2 et plusieurs tours de SHA2 (fx nix Crypt avec SHA256 ) sont considérés comme les troisièmes meilleurs (dont l'un est le meilleur) dépend en grande partie du nombre d'itérations utilisé).

(Notez que "Hacker News" est principalement une communauté de programmation, et non pas comme son nom l'indique à certains une communauté de spécialistes de la sécurité (même si certains d'entre eux traînent aussi).)

Si vous regardez autour de ce site, sous les balises cryptographiemots de passe et hachage fx, alors vous verrez qu'il n'y a généralement pas un seul "meilleur" hachage de mot de passe mentionné. Je suppose que c'est en partie parce que les vrais cryptographes n'ont pas de consensus clair sur lequel est le plus fort, en raison de l'examen par les pairs relativement limité.

Voici une comparaison assez impartiale et facile à lire (qui n'inclut pas scrypt, probablement parce que c'est encore trop nouveau).

La vitesse n'est pas pertinente, car j'itère le hachage sur une durée fixe (plutôt qu'un nombre fixe d'itérations).

Avec certains de ces hachages, vous ne pouvez pas vraiment faire ça. Vous fournissez un "facteur de travail" lorsque vous appelez la bibliothèque, et la bibliothèque s'occupe du reste.

20
Jesper M

CRYPT_BLOWFISH (OpenBSD bcrypt, basé sur le chiffrement symétrique Blowfish, mais est un algorithme de hachage réel, il semble y avoir beaucoup de confusion à ce sujet) et CRYPT_SHA512 sont les meilleurs. Les deux offrent la possibilité de mettre à l'échelle le nombre de "tours" utilisés, vous permettant de choisir un compromis sécurité/performances.

Par exemple, le nombre de tours par défaut pour Blowfish est 7 (la plage de valeurs est 4-31). Cette valeur est logarithmique, donc chaque augmentation entraîne l'exécution de l'algorithme 10 fois plus. Une valeur de 13, prend presque 1 minute par hachage sur un Core2Duo 2.4ghz

Un réglage aussi élevé que possible en termes de performances entraînera la sécurité la plus élevée.

remarque: récemment, un bogue a été trouvé dans certaines implémentations de bcrypt, et en tant que tel, vous souhaiterez peut-être utiliser SHA-512 à la place.

Remarque: SHA-512 est plus rapide à calculer que SHA-256 sur les processeurs 64 bits (en particulier s'il est optimisé avec SSE2_64. Spécifiquement, vous devriez considérer cela et utiliser des tours supplémentaires pour vous assurer que vos hachages sont assez forts pour leur usage.

L'application open source hashkill , a publié des repères de performances sur la vitesse à laquelle les GPU modernes pourraient traverser les algorithmes de hachage modernes. Plus précisément, une Radeon HD 6990 peut faire: 11001 Megahashes/sec de MD5 droit (CRYPT_MD5 est salé, et l'implémentation de FreeBSD utilise 100 tours). SHA1 droit à 3444 Megahashes/s.

7
Allan Jude

Je vous recommande d'utiliser phpass

Il s'agit d'un cadre de hachage de mot de passe du domaine public portable à utiliser dans les applications PHP. Il est destiné à fonctionner avec PHP 3 et supérieur, et il a en fait été testé avec au moins PHP 3.0.18 à 5.3.0 jusqu'à présent.

La méthode de hachage préférée (la plus sécurisée) prise en charge par phpass est le bcrypt basé sur Blowfish de style OpenBSD, également pris en charge avec notre package crypt_blowfish du domaine public (pour les applications C), et connu dans PHP comme CRYPT_BLOWFISH , avec une solution de rechange aux hachages étendus basés sur DES de style BSDI, connus dans PHP comme CRYPT_EXT_DES, et une solution de dernier recours aux hachages de mot de passe salés et à nombre d'itérations variable basés sur MD5 implémentés dans phpass lui-même ( également appelés hachages portables).

Comme le site Web le dit, le bcrypt basé sur Blowfish est le hachage le plus sécurisé. Je crois que c'est vrai parce que c'est " preuve de loi de Moore " alors que la plupart des autres ne le sont pas.

0
Alfred