67 votes

Sécurité du mot de passe : sha1, sha256 ou sha512

Après avoir su que le hachage d'un mot de passe est mon choix pour faire un formulaire de connexion. Je suis maintenant confronté à un autre problème : sha1, sha256 ou sha512 ?

Il s'agit d'une méthode standard utilisant du sel, je crois que je l'ai trouvée dans un de mes livres de référence,

# create a salt using the current timestamp
$salt = time();

# encrypt the password and salt with SHA1
$usr_password = sha1($usr_password.$salt);

mais après avoir fait quelques recherches sur sha1, j'ai appris qu'il pourrait ne pas être sûr à l'avenir, suggérant d'utiliser hash().

Mais je ne comprends pas bien l'utilisation de hash() - par exemple -

$usr_password = hash('sha256', $usr_password); 

Qu'est-ce que "sha256" ou "sha512", que j'ai trouvé. aquí ?

Puis-je mettre quelque chose à la place, comme '@123' ?

Pourquoi s'appelle-t-il salt de toute façon - $salt = time() ; n'est rien d'autre qu'un timestamp unix, n'est-ce pas ?

Gracias.

54voto

Erwan Legrand Points 797

N'écrivez pas votre propre fonction de cryptage de mot de passe ! Laissez ça aux cryptographes chevronnés. La cryptographie est difficile à maîtriser. La sécurité est difficile à mettre en place.

SHA1, SHA256 et SHA512 sont des condensations de messages et non des fonctions de hachage de mots de passe.

Actuellement, la seule fonction standard (c'est-à-dire approuvée par le NIST) de hachage de mot de passe ou de dérivation de clé est PBKDF2. D'autres choix raisonnables, si l'utilisation d'un standard n'est pas nécessaire, sont bcrypt et le plus récent scrypt. Wikipedia a des pages pour ces trois fonctions :

Passer de SHA1 à SHA256 ou SHA512 n'améliorera pas tellement la sécurité de la construction. Le calcul d'un hachage SHA256 ou SHA512 est très rapide. Un attaquant disposant d'un matériel courant peut toujours tenter des dizaines de millions (avec un seul CPU) ou même des milliards (avec un seul GPU) de hachages par seconde. Les bonnes fonctions de hachage de mot de passe incluent un facteur de travail pour ralentir les attaquants.

Voici une autre faiblesse du schéma ci-dessus : un attaquant peut précalculer une fois un hachage de mot de passe et le réutiliser pour chaque entrée du fichier ou de la base de données des mots de passe. Une fois le précalcul effectué, le calcul des hachages de ces mots de passe avec une valeur de sel donnée est trivial, car les messages digest fonctionnent de manière incrémentielle. Ainsi, les précalculs pour $password peuvent être réutilisés pour calculer le hachage de $password.$salt pour chaque valeur de $salt dans le fichier de mots de passe.

Voici quelques suggestions pour les programmeurs PHP : tout d'abord, lisez la FAQ PHP : http://php.net/manual/en/faq.passwords.php et ensuite utiliser crypt() ou PHPPASS : http://www.openwall.com/phpass/ .

51voto

ActuatedCrayon Points 783

Vous devriez utiliser SHA-2 car des failles ont été découvertes dans SHA-1.

SHA-2 a différents types. Les valeurs binaires que vous indiquez (par exemple 256 et 512) sont les plus courantes. L'une ou l'autre devrait convenir pour le hachage de mots de passe. Toutefois, SHA-512 peut être préféré si le temps de hachage n'est pas un problème.

Vous voulez saler les hachages car quelqu'un pourrait utiliser les tables arc-en-ciel pour les rechercher. Comme vous le savez, les valeurs de hachage auront toujours la même valeur pour la même entrée. Si vos utilisateurs utilisent un mot de passe court, il serait facile de tester toutes les combinaisons.

Vous devez choisir un sel et celui-ci doit toujours rester constant. Vous pouvez utiliser une valeur temporelle (un timestamp unix, le nombre de secondes depuis 1970) pour trouver votre sel. Je vous suggère également d'ajouter quelques caractères aléatoires supplémentaires. Vous utilisez ensuite le sel partout où vous utilisez le mot de passe. Le sel sert à rendre les mots de passe, même courts, longs (sécurisés).

25voto

Erick Points 468

La réponse acceptée ici est un mauvais conseil, et toute la discussion liée au stockage du sel par rapport au non stockage du sel est stupide.

Vous devez utiliser un algorithme de hachage lent tel que pbkdf2, ou bcrypt, ou scrypt pour le hachage. SHA 256 ou 512 est inapproprié pour le hachage des mots de passe.

En ce qui concerne le sel et le stockage par rapport au non stockage : Il n'y a tout simplement aucune raison de ne pas stocker le sel à côté du hachage du mot de passe. Le sel doit absolument être différent pour chaque utilisateur, mais le garder secret n'a aucune valeur significative. Trouver un algorithme alambiqué pour recréer un sel est au mieux une perte de temps.

Range le sel, c'est comme ça que ça doit être fait.

19voto

Mark Byers Points 318575

sha-256 est plus sûre que celle de sha1 . Il appartient à la famille connue sous le nom de SHA-2 .

En 2005, des failles de sécurité ont été identifiées dans SHA-1, à savoir qu'une faiblesse mathématique pourrait exister, indiquant qu'une fonction de hachage plus forte serait souhaitable. Bien que SHA-2 présente certaines similitudes avec l'algorithme SHA-1, ces attaques n'ont pas été étendues avec succès à SHA-2.

Cependant, pour le hachage des mots de passe, je recommande d'utiliser bcrypt . Les fonctions de hachage SHA n'ont pas été conçues pour sécuriser les mots de passe et ne doivent pas être utilisées à cette fin.

9voto

Erik Aigner Points 7182

Pour les mots de passe, vous devez utiliser bcrypt parce qu'elle a un facteur de coût. SHA n'est pas conçu pour les mots de passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X