Duplicata possible:
Quelle méthode de hachage de mot de passe dois-je utiliser?
Il y a une tonne d'excellents articles sur la sécurité des mots de passe dans les bases de données sur le débordement de pile et sur d'autres sites et comme je suis complètement nouveau dans ce domaine, j'ai passé pas mal d'heures à essayer d'en savoir plus à ce sujet ces derniers jours. Cependant, il y a tellement de suggestions différentes et de meilleures pratiques que je suis toujours très confus ...
De plus, il y a encore beaucoup de messages plus anciens de 2007-2010, etc. J'ai vu à quelle vitesse les choses changent, je ne sais pas si c'est encore courant de l'utiliser comme ils le suggèrent. Donc, je voulais résumer ce que j'ai trouvé dans les messages et ensuite demander si cette méthode que je trouvais était une bonne pratique ...
Donc, ce n'est pas un guide, mais un résumé, je sais que c'est très très basique et s'il y a des erreurs veuillez me corriger!
Donc, il y a différentes opinions sur l'utilisation de SHA256, SHA512? Devriez-vous utiliser hash_hmac? Certains disent oui: ( http://rdist.root.org/2009/10/29/stop-using-unsafe-keyed-hashes-use-hmac/ ) certains disent que l'utilisation des bibliothèques est la seule manière sécurisée ... et puis une ou deux fois dans un article que j'ai lu pour ne pas utiliser les bibliothèques comme bcrypt ou bubble fish ??
Est-il vraiment nécessaire d'utiliser une bibliothèque ou est par exemple une méthode comme celle-ci suffit:
function hash_password($password, $nonce) {
for ($i = 0; $i < 5000; $i++) {
$hashed_pass = hash_hmac('sha512', $hashed_pass . $nonce . $password, $site_key);
}
return $hashed_pass;
}
Beaucoup de gens disent de ne pas inventer votre propre algo, donc j'ai un peu peur juste d'utiliser quelque chose d'auto-inventé.
Je peux imaginer que c'est difficile à prévoir, mais combien de temps une méthode utilisée jusqu'à présent peut-elle être considérée comme suffisamment sûre?
MISE À JOUR: Alors, merci pour tous vos excellents commentaires. Il y a un point principal qui manque, comme je vois et beaucoup d'entre vous l'ont dit: la sécurité par mot de passe, ce qui signifie qu'un mot de passe fort est la base. Je pense avoir compris le message, merci encore! :)
MISE À JOUR 2: Juste pour terminer, j'ai trouvé le code suivant sur http://www.lateralcode.com/creating-a-random-string-with-php/ que j'utilise pour générer un sel aléatoire :
function Rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!§$%&/().-:;_#+*[]{}=";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ Rand( 0, $size - 1 ) ];
}
return $str;
}
$random_salt= Rand_string(20);
Informations générales:
Belle question mais tout ce que je peux dire, c'est que cela dépend totalement de l'utilisation. Si vous ne l'utilisez que pour un petit site Web, il y a de fortes chances que seuls des "script kiddies" vous rendent visite, dans ce cas, un simple SHA1 avec du sel est tout à fait suffisant aujourd'hui également. Dans ce cas, 5-8-10 ans ou peut-être même plus est totalement bon, les script kiddies n'y entreront pas vraiment s'ils voient qu'ils ne peuvent pas entrer facilement. Si votre site est attaqué pour une raison quelconque - site monétaire, etc., vous devez utiliser les dernières fonctions disponibles. Dans ce cas, je risquerais même d'utiliser une fonction non officielle mais déjà portée. En ce moment, il y a une compétition SHA3, pour les websties qui auront beaucoup d'argent, j'utiliserais l'un des 5 concurrents de ceux-ci.
Les points que je dis importants sont:
1. utilisez un sel aléatoire, peut-être même 20 caractères. Il est beaucoup plus difficile de casser les mots de passe, et même s'ils sont cassables, cela prend trop de temps pour en valoir la peine.
2. utilisez SHA-1, SHA-2 ou WHIRLPOOL. Avec du bon sel, le MD5 est également correct, mais je suggère toujours ces derniers.
. vous pouvez utiliser n'importe quelle excellente cryptographie si les mots de passe des utilisateurs sont triviaux. Vous devez vous assurer qu'ils utilisent des mots de passe non-dictionnaire, longs avec des majuscules, des lettres minuscules, des chiffres et des symboles sinon il est facilement cassable par la force brute. Vous pourriez penser qu'ils pourraient être obligés de changer de mot de passe chaque année.
Au code:
Boucler plusieurs fois pourrait être utile mais je ne pense pas que 5000 soient nécessaires. 3 pour une sécurité normale est bon, ou 100, peut-être que 1000 pourrait fonctionner, mais je pense que 5000 est tout simplement trop. SHA-256 est bon, mais vous pouvez utiliser un algorithme spécialement développé pour cela, voir les commentaires.
Vous avez oublié une petite chose:
Juste 2 mots qui surpondèrent tout votre brillant sujet.
Il y a en effet des centaines de sujets sur Stackoverflow vous disant d'utiliser tel ou tel algorithme de hachage et sels aléatoires.
.
Quant aux pauvres utilisateurs qui ne se souviennent pas $#%H4df84a$%#R
mots de passe - faites-leur simplement utiliser non pas un mot de passe mais un mot de passe.
Is it a good day today, Winkie?
Utilise différentes lettres majuscules ainsi qu'un mot de passe de la complexité recommandée mais beaucoup plus facile à retenir.
Bien sûr, la phrase ne doit pas être aussi courante que les mots de passe courants comme "Joe" ou "123".
"Bonjour", "Oh mon Dieu! Ils ont tué Kenny!" les phrases doivent être évitées.
Mais en ajoutant de la personnalité, ce serait bien:Oh My God! They moved Cthulhu!
semble assez
Une autre chose à mentionner est une communication sécurisée entre le serveur et le navigateur
Sans lui, un mot de passe simple peut facilement être "détecté" sur l'un des routeurs impliqués dans la communication.
SSH ou une implémentation de autorisation Digest n'est pas moins essentiel.
Une fonction de hachage à usage général (MD5, SHA1, SHA256) avec un bon hachage peut être suffisamment sécurisée pour la plupart des sites Web plus petits, compte tenu de la puissance de calcul actuelle. Cependant, la loi de Moore garantira que même les bons mots de passe seront exposés à des attaques par force brute dans un proche avenir. Le problème est que les fonctions de hachage peuvent être calculées beaucoup trop rapidement. La meilleure solution consiste à utiliser bcrypt ou PBKDF2 avec un nombre élevé d'itérations. Bcrypt vs PBKDF2 a été discuté sur http://security.stackexchange.com .
Certaines personnes pourraient penser que c'est excessif pour la plupart des sites, mais rappelez-vous que les mots de passe sont réutilisés tout le temps et que le stockage des mots de passe est généralement quelque chose que vous ne changerez pas jusqu'à ce qu'il y ait un problème.
Recommandations:
La fonction hash_hmac()
serait un bon choix, elle peut même surmonter les problèmes d'un algorithme de hachage plus faible. Le seul problème est qu'il est trop rapide. Cela signifie qu'avec suffisamment de puissance CPU (cloud), la création de différentes tables Rainbow devient possible, c'est la raison de l'itération. Si vous avez besoin de cette haute sécurité, vous pouvez mesurer le temps dont vos itérations ont besoin, puis calculer le nombre d'itérations nécessaires pour un temps donné.
Éditer:
Itérer peut résoudre ce problème, il doit être fait de manière à ce que l'on puisse augmenter le nombre d'itérations plus tard, sans invalider les hachages existants. Ceci est nécessaire pour s'adapter au nouveau matériel futur, mais nécessite de stocker les paramètres de hachage avec le hachage.
L'algorithme de hachage bcrypt a été conçu pour répondre à cette demande, j'ai écrit un petit exemple de la façon d'utiliser bcrypt avec PHP 5. , j'ai essayé de le commenter, donc on peut comprendre ce qui se passe.