web-dev-qa-db-fra.com

SHA1 vs md5 vs SHA256: lequel utiliser pour un PHP s'identifier?

Je crée un identifiant php, et j'essaie de décider d'utiliser SHA1 ou Md5, ou SHA256, ce que j'ai lu dans un autre article de stackoverflow. Certains d'entre eux sont-ils plus sécurisés que d'autres? Pour le SHA1/256, est-ce que j'utilise toujours un sel? 

Aussi, est-ce un moyen sécurisé de stocker le mot de passe sous forme de hachage dans mysql?

function createSalt()
{
    $string = md5(uniqid(Rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();

$hash = sha1($salt . $hash);
131
Tony Stark

Ni. Vous devriez utiliser bcrypt. Les hachages que vous mentionnez sont tous optimisés pour être simples et rapides sur le matériel. Par conséquent, les fissurer partagent les mêmes qualités. Si vous n'avez pas d'autre choix, assurez-vous au moins d'utiliser un long sel et un nouveau hachage plusieurs fois.

Utilisation de bcrypt dans PHP 5.5+

PHP 5.5 offre nouvelles fonctions pour le hachage de mot de passe _. Cette approche est recommandée pour le stockage de mots de passe dans les applications Web modernes.

// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10

// Verifying the password against the stored hash  
if (password_verify($password, $hash)) {
    // Success! Log the user in here.
}

Si vous utilisez une ancienne version de PHP vous devez vraiment mettre à niveau , mais jusqu'à ce que vous le fassiez, vous pouvez utiliser password_compat pour exposer cette API.

Aussi, s'il vous plaît laissez password_hash() générer le sel pour vous. Il utilise un [CSPRNG] (http: //

Deux mises en garde de bcrypt

  1. Bcrypt tronquera silencieusement tout mot de passe de plus de 72 caractères.
  2. Bcrypt sera tronqué après tous les caractères NUL.

( Proof of Concept } _ pour les deux mises en garde ici.)

Vous pourriez être tenté de résoudre la première mise en garde par avant le hachage de vos mots de passe avant de les exécuter via bcrypt , mais votre application risque alors de se lancer tête nue dans la seconde. 

Au lieu d'écrire votre propre schéma, utilisez une bibliothèque existante écrite et/ou évaluée par des experts en sécurité.

TL; DR - Utilisez bcrypt .

104
Johannes Gorset

Je pense que l’utilisation de md5 ou de sha256 ou de tout hachage optimisé pour la vitesse convient parfaitement et je suis très curieux d’entendre les réprimandes que d’autres utilisateurs pourraient avoir. Voici mes raisons

  1. Si vous autorisez les utilisateurs à utiliser des mots de passe faibles tels que Dieu, l'amour, la guerre ou la paix, quel que soit le cryptage, vous autoriserez toujours l'utilisateur à saisir le mot de passe, et non le hachage; ces mots de passe sont souvent utilisés en premier. C'est doncPASva avoir quelque chose à voir avec le cryptage.

  2. Si vous n'utilisez pas SSL ou n'avez pas de certificat, les attaquants écoutant le trafic seront en mesure d'extraire le mot de passe. Toute tentative de cryptage avec javascript ou autre passe du côté du client et est facilement fissurée et surmontée. Encore une fois, ceci estPASva avoir quelque chose à voir avec le cryptage des données côté serveur.

  3. Les attaques par force brute tireront parti des mots de passe faibles et encore une fois parce que vous autoriserez l'utilisateur à saisir les données si vous ne possédez pas la limite de connexion de 3 ou même un peu plus, le problème sera de nouveauPASn'a rien à faire avec cryptage des données.

  4. Si votre base de données est compromise, il est fort probable que tout a été compromis, y compris vos techniques de hachage, peu importe la façon dont vous l'avez faite. Encore une fois, cela pourrait être une attaque XSS d'employé mécontente ou une injection SQL ou une autre attaque qui n'a rien à voir avec le cryptage de votre mot de passe.

Je crois que vous devriez toujours chiffrer, mais la seule chose que je peux voir, c'est que les personnes qui ont déjà accès ou qui ont déjà eu accès à la base de données ne puissent pas simplement lire le mot de passe à voix haute. S'il s'agit d'une personne non autorisée dans la base de données, vous avez de plus en plus à vous inquiéter. C'est pourquoi Sony a été prise parce qu'elle pensait qu'un mot de passe crypté protégeait tout, y compris les numéros de carte de crédit, mais protégeait uniquement ce champ.

Le seul avantage pur que je puisse voir avec les cryptages complexes de mots de passe dans une base de données est de retarder les employés ou autres personnes ayant accès à la base de données à la lecture des mots de passe. Donc, s’il s’agit d’un petit projet ou de quelque chose qui ne me préoccupe pas beaucoup au sujet de la sécurité côté serveur, je me préoccupe davantage de la sécurité de tout ce que le client pourrait envoyer au serveur, comme une injection SQL, des attaques XSS ou une multitude d’autres moyens. pourrait être compromise. Si quelqu'un n'est pas d'accord, j'ai hâte de lire comment un mot de passe super crypté est indispensable du côté client.

La raison pour laquelle j'ai voulu essayer de clarifier les choses, c'est parce que trop souvent, les gens croient qu'un mot de passe crypté signifie qu'ils n'ont pas à craindre de le compromettre et qu'ils cessent de se préoccuper de la sécurité du site Web.

25
Roger Johnson

Comme l'a souligné Johannes Gorset, le message de Thomas Ptacek de Matasano Security explique pourquoi de simples fonctions de hachage générales telles que MD5, SHA1, SHA256 et SHA512 sont de mauvais choix de hachage de mots de passe.

Pourquoi? Ils sont trop rapides - vous pouvez calculer au moins 1 000 000 de hachages MD5 par seconde avec un ordinateur moderne, de sorte que la force brute est réalisable contre la plupart des mots de passe utilisés par les utilisateurs. Et c'est beaucoup moins qu'un cluster de serveurs de crack basé sur GPU!

Le salage sans étirement de la clé signifie que vous ne pouvez pas précalculer la table Rainbow, vous devez la construire de manière ad hoc pour ce sel spécifique. Mais cela ne rendra pas les choses plus difficiles.

Utilisateur @ Will dit:

Tout le monde en parle comme s'ils pouvaient être piratés au-dessus du l'Internet. Comme déjà dit, limiter les tentatives rend impossible. craquer un mot de passe sur Internet et n'a rien à voir avec le hacher.

Ils n'en ont pas besoin. Apparemment, dans le cas de LinkedIn , ils ont utilisé la vulnérabilité commune d'injection SQL pour obtenir la table de base de données de connexion et ont déchiffré des millions de mots de passe hors ligne.

Il revient ensuite au scénario de l'attaque hors ligne:

La sécurité entre vraiment en jeu lorsque toute la base de données est compromis et un pirate informatique peut alors exécuter 100 millions de mots de passe tentatives par seconde contre le hash md5. SHA512 est environ 10 000 fois Ralentissez.

Non, SHA512 n'est pas 10000 fois plus lent que MD5 - il en faut environ deux fois plus. Crypt/SHA512, en revanche, est une bête très différente qui, comme son homologue BCrypt, effectue key stretching , produisant un hachage très différent avec un sel aléatoire intégré et prend entre 500 et 999999 fois plus à calculer (l’étirement est ajustable).

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Ainsi, le choix de PHP est soit Crypt/Blowfish (BCrypt), Crypt/SHA256 ou Crypt/SHA512. Ou au moins Crypt/MD5 (PHK). Voir www.php.net/manual/en/function.crypt.php

14
LexLythius

Utilisez SHA256. Ce n'est pas parfait, car SHA512 serait idéal pour un hachage rapide, mais parmi les options, c'est le choix définitif. Selon toute technologie de hachage, veillez à saler le hachage pour plus de sécurité.

Comme note supplémentaire, FRKT, montrez-moi s'il vous plaît où quelqu'un peut facilement craquer un hachage salé SHA256? Je suis vraiment très intéressé de voir cela.

Important Edit:

À l'avenir, veuillez utiliser bcrypt comme un hachage durci. Plus d'informations peuvent être trouvé ici .


Modifier sur le salage:

Utilisez un nombre aléatoire, ou un flux d'octets aléatoire, etc. Vous pouvez également utiliser le champ unique de l'enregistrement dans votre base de données comme sel, ainsi, le sel est différent pour chaque utilisateur.

13
Kyle Rozendo

Ce que les gens semblent manquer, c'est que si le pirate informatique a accès à la base de données, il a probablement également accès au fichier php contenant le hachage du mot de passe et peut probablement le modifier pour lui envoyer tous les combos de mot de passe de nom d'utilisateur réussis. S'il n'a pas accès au répertoire Web, il peut toujours choisir un mot de passe, le hacher et l'écrire dans la base de données. En d'autres termes, l'algorithme de hachage importe moins que la sécurité du système, et limiter le nombre de tentatives de connexion, même si vous n'utilisez pas SSL, permet à l'attaquant d'écouter la connexion pour obtenir les informations. À moins que l'algorithme ne prenne beaucoup de temps à calculer (pour vos propres besoins), alors SHA-256 ou SHA-512 avec un sel spécifique à l'utilisateur devrait suffire.

En tant que mesure de sécurité supplémentaire, configurez un script (bash, batch, python, etc.) ou un programme, attribuez-lui un nom obscur et demandez-lui de vérifier si login.php a changé (vérifiez l’horodatage) et de vous envoyer un email. si c'est le cas. Aussi, devrait probablement consigner toutes les tentatives de connexion avec les droits d’administrateur, ainsi que toutes les tentatives infructueuses de connexion à la base de données et les journaux envoyés par courrier électronique.

4
Dennis Bellinger

Tout le monde en parle, comme s'ils pouvaient être piratés sur Internet. Comme déjà dit, limiter les tentatives empêche le piratage d'un mot de passe sur Internet et n'a rien à voir avec le hash.

Le sel est un must, mais la complexité ou les sels multiples ne comptent même pas. Tout sel seul empêche l’attaquant d’utiliser une table Rainbow prédéfinie. Un sel unique par utilisateur empêche l'attaquant de créer une nouvelle table Rainbow à utiliser avec l'ensemble de votre base d'utilisateurs.

La sécurité entre réellement en jeu lorsque toute la base de données est compromise et qu'un pirate informatique peut alors effectuer 100 millions de tentatives de mot de passe par seconde contre le hachage md5. SHA512 est environ 10 000 fois plus lent. Un mot de passe complexe avec le pouvoir d'aujourd'hui pourrait encore prendre 100 ans avec md5 et 10 000 fois plus longtemps avec SHA512. Les sels n'arrêtent pas du tout une force brute, car ils doivent toujours être connus. Si l'attaquant télécharge votre base de données, il est probablement resté dans votre système.

3
Will

MD5 est défectueux en raison de problèmes de collision - deux mots de passe différents générant éventuellement le même md-5.

Sha-1 serait très sûr pour cela. La raison pour laquelle vous stockez la version «sha-1» salée du mot de passe est telle que le serveur swerver ne conserve pas le mot de passe pseudo de l'utilisateur, qu'il peut utiliser avec les serveurs d'autres personnes. Sinon, quelle différence cela fait-il? 

Si le pirate informatique vole toute votre base de données non chiffrée, la seule chose qu'un mot de passe haché est de l'empêcher de se faire passer pour l'utilisateur pour les prochains codes d'accès: le pirate informatique possède déjà les données.

A quoi sert l'attaquant d'avoir la valeur hachée, si ce que votre utilisateur entre est un mot de passe en clair? 

Et même si le pirate doté de la technologie future pouvait générer un million de clés sha-1 par seconde pour une attaque par force brute, votre serveur traiterait-il un million de connexions par seconde pour permettre au pirate de tester ses clés? Si vous laissez le pirate informatique essayer de vous connecter avec le logiciel salé sha-1 au lieu d’un mot de passe semblable à une connexion normale.

Le mieux est de limiter les tentatives d'ouverture de session incorrectes à un nombre raisonnable, par exemple 25, puis de laisser l'utilisateur sortir pour une minute ou deux. Et si les tentatives de connexion bady cumulées atteignent 250 dans les 24 heures, fermez l'accès au compte et envoyez un courrier électronique au propriétaire.

1
Brad Jensen

Utilisez argon2i. La fonction de hachage de mots de passe argon2 a remporté le concours de hachage de mots de passe.

Les autres choix raisonnables, si vous utilisez argon2 n'est pas disponible, sont scrypt, bcrypt et PBKDF2. Wikipedia a des pages pour ces fonctions:

MD5, SHA1 et SHA256 sont des condensés de message et non des fonctions de hachage de mot de passe. Ils ne conviennent pas à cette fin.

Passer de MD5 à SHA1 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 utilisant le même matériel pourrait toujours essayer des dizaines de millions (avec un seul processeur), voire des milliards (avec un seul GPU) de hachages par seconde. Les bonnes fonctions de hachage des mots de passe incluent un facteur de travail pour ralentir les attaques par dictionnaire.

Voici une suggestion pour les programmeurs PHP: lisez le PHP FAQ puis utilisez password_hash () .

1
Erwan Legrand

Voici la comparaison entre MD5 et SHA1. Vous pouvez avoir une idée précise de celui qui est le meilleur.

 enter image description here

1

Supposons le point suivant: les pirates informatiques volent notre base de données, y compris les utilisateurs et le mot de passe (crypté). Et les pirates ont créé un faux compte avec un mot de passe qu'ils connaissent.

MD5 est faible parce que sa génération est courte, populaire et pratiquement chaque génération de hachage sans mot de passe est faible d’une attaque par dictionnaire. Mais..

Donc, disons que nous utilisons toujours MD5 avec un SALT. Les pirates ne connaissent pas le SALT mais ils connaissent le mot de passe d'un utilisateur spécifique. Pour qu'ils puissent tester: 12345 où 12345 est le mot de passe connu et ????? est le sel. Les pirates peuvent tôt ou tard deviner le sel.

Toutefois, si nous utilisions un MD5 + SALT et que nous appliquions MD5, il n’existe aucun moyen de récupérer les informations. Cependant, je le répète, le MD5 est encore court.

Par exemple, disons que mon mot de passe est: 12345. Le sel est BILLCLINTON

md5: 827ccb0eea8a706c4c34a16891f84e7b

md5 avec le hachage: 56adb0f19ac0fb50194c312d49b15378

mD5 avec le hachage sur md5: 28a03c0bc950decdd9ee362907d1798a J'ai essayé d'utiliser ces services en ligne et je n'en ai trouvé aucun qui soit capable de le casser. Et ce n'est que MD5! (peut être comme aujourd'hui il sera craquable parce que j'ai généré le md5 en ligne)

Si vous voulez exagérer alors SHA256 est plus que suffisant si son appliqué avec un sel et deux fois.

tldr MD5 (HASH + MD5 (mot de passe)) = ok mais bref, SHA256 est plus que suffisant.

0
magallanes

Un cryptage md5 est l’un des pires, car vous devez activer le code et celui-ci est déjà décrypté. Je vous recommanderais le SHA256. Je programme un peu plus longtemps et j'ai eu une bonne expérience. Ci-dessous serait également un cryptage.

password_hash() example using Argon2i

<?php
echo 'Argon2i hash: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>
The above example will output something similar to:

Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
0
Lars Gross