2011-05-24 7 views
0

je teste plusieurs combinaisons de SHA1 et md5:utilisateurs php les mots de passe protection

<?php 
$test = 'fail test'; 
echo nl2br ("Text: $test\n"); 
echo nl2br ("md5: ".md5($test)."\nsha1: ".sha1($test)."\nsha1(md5): ".sha1(md5($test))."\nmd5(sha1): ".md5(sha1($test))); 
?> 

Sortie:

Text: fail test 
md5: 748410d0085967c496d54dd8fcbecc96 
sha1: d730125e8cb8576459173655148fb6896ef44c09 
sha1(md5): faa3ebeecfec45e509e93e6b245a69e2a78785ea 
md5(sha1): b48e89b85c350c91eb302c1de96d4249 

Lequel mieux, ou peut-être autre chose utilisateur? Si oui, quoi alors?

+0

Je ne suis pas sûr de ce que vous testez? – Neal

+4

Mieux dans quel but? Si vous recherchez la sécurité, je n'utiliserais pas MD5. L'utilisation des deux n'augmente pas la sécurité. Dans certains cas, cela peut en fait le diminuer. –

+0

peut-être sujet n'est pas correct, mais vous voulez trouver une solution comment faire passer les utilisateurs de crack impossible ou le rendre juste difficile de le fissurer. – ZeroSuf3r

Répondre

1

Le hachage d'un hachage n'offre aucune sécurité supplémentaire. (En fait, cela pourrait aggraver la situation si la personne a une table de recherche de hash-of-hash.)

Le meilleur hachage sera celui qui est le plus coûteux à effectuer sans aucune vulnérabilité. Je voudrais hash mots de passe avec au moins sha-256.

Hachez toujours vos mots de passe avec une clé salée. Cette clé doit être unique par mot de passe. Il n'a pas besoin d'être stocké en privé. Le but d'un mot de passe salé est que le pirate qui a accédé à votre base de données ne peut pas simplement comparer le hachage à une liste connue de hachages correspondant à des mots de passe communs. Au lieu de cela, il doit essayer de forcer le mot de passe en essayant tous les mots de passe possibles. En utilisant un salt unique par mot de passe, vous garantissez que chaque hash de la base de données est différent, même s'il utilise le même mot de passe.

Pour ajouter un mot de passe, créez simplement une chaîne de caractères aléatoire et ajoutez-la au mot de passe. Voici un hachage de l'échantillon avec un sel de 48 bits et 256-sha:

function make_password($password) 
{ 
    # random 48-bit salt (8 chars when base64 encoded) 
    $salt = base64_encode(pack('S3', mt_rand(0,0xffff), mt_rand(0,0xffff), mt_rand(0, 0xffff))); 

    return $salt.hash('sha256', $salt.$password); 
} 

function check_password($password, $hash) 
{ 
    $salt = substr($hash, 0, 8); 
    return hash('sha256', $salt.$password) == substr($hash, 8); 
} 

$password = 'password'; 
$hash = make_password('password'); 

echo $hash."\n"; 

var_dump(check_password('password', $hash)); 
var_dump(check_password('wrong', $hash)); 

Chaque fois que vous l'exécutez, le hachage sera différent. Pour valider un mot de passe, sélectionnez la ligne correspondant au nom d'utilisateur, puis appelez le check_password($password_from_user, $hash_from_db).

Voici un exemple de sortie:

AzrD1jZzc693714a43ad5dfd4106c0a620ef23ff9915070711fa170a6670b8164862b496 
bool(true) 
bool(false) 

Vous pouvez utiliser un sel plus ou un algorithme de hachage plus fort si vous préférez. Mais au minimum, je voudrais utiliser quelque chose comme ce qui précède.

2

Les deux sont des fonctions de hachage cryptographiques qui fonctionnent unidirectionnelles seulement, la différence principale étant que la taille de sortie MD5 est de 128 bits alors que SHA-1 est de 160 bits. En bref, je ne vois pas qu'ils sont très différents à utiliser malgré MD5 est plus fréquente ces jours-ci. Curieusement, je ne vois pas vraiment comment md5 ($ text) est différent de md5 (sha ($ text)) quand ils sont tous cryptés en une chaîne de 32 caractères, qu'en est-il de md5 ($ text. "Token ") par exemple?

Et, que voulez-vous dire par mieux? Est-ce plus beau ou plus de sécurité? Voir bcrypt si vous préférez la sécurité :) Wikipedia: http://en.wikipedia.org/wiki/Bcrypt

+0

Ce sont des fonctions de hachage, pas des fonctions de cryptage. Le cryptage implique de pouvoir les décrypter. À l'exception d'une théorie mathématique révolutionnaire fondamentale ou d'une faille inconnue dans l'une ou l'autre méthode de hachage, sha1 et md5 sont des opérations unidirectionnelles. –

+0

Je vois ce que tu veux dire :) Je sais que MD5 est défini comme une fonction de hachage cryptographique, mais parfois je dis un verbe qui décrit l'action de convertir une chaîne normale en une chaîne md5, je dis habituellement "crypter avec md5". Cela semble être théoriquement faux, mais les gens le disent juste ... Merci de me le faire savoir de toute façon. –

1

Vous devriez saler vos mots de passe, TOUJOURS. Cela n'empêche pas la force brute à travers un formulaire de connexion, mais si quelqu'un réussissait à obtenir les détails, il serait beaucoup plus difficile à craquer (les tables arc-en-ciel seraient inutiles à moins d'avoir aussi du sel). ajouter sur les données originales ou mangling d'une manière contrôlée, il va rendre la sécurité un peu mieux. Personne ne peut jamais inverser un hachage, mais ils peuvent trouver d'autres entrées qui correspondent au hachage. En manipulant l'entrée de l'utilisateur, il sera plus difficile de se connecter aux pirates informatiques. Par exemple, si la passe d'un utilisateur est 123456 (seul un retard l'utilisera, mais c'est un exemple), si vous ajoutez un sel de "sel" à 123456salt, le MD5 sera 207acd61a3c1bd506d7e9a4535359f8a. Un pirate peut craquer pour devenir 123456salt, mais quand il s'agit de l'utiliser sur votre formulaire de connexion, votre code ajoutera du sel et la connexion échouera.

Questions connexes