2009-10-19 5 views
0

Hey je voudrais avoir votre entrée sur ceest-ce correct? salage

Je l'utilise pour générer des sels uniques à chacun de mes utilisateurs lors de leur inscription (lettres et chiffres aléatoires). quelle est la chance que les sels vont colider?

uniqid(mt_rand()); 

J'utilise ensuite md5 au sel de hachage, mot de passe et e-mail (dans cet ordre) ainsi que le mot de passe et ressasser lorsqu'ils se connectent en.

md5($salt . $password . $email); 

Combien plus sûr que juste md5 est-ce? Quelque chose que je peux améliorer?

CREATE TABLE IF NOT EXISTS `users` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
`username` varchar(24) CHARACTER SET utf8 NOT NULL, 
`password` varchar(32) CHARACTER SET utf8 NOT NULL, 
`email` varchar(255) CHARACTER SET utf8 NOT NULL, 
`salt` varchar(255) CHARACTER SET utf8 NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `username` (`username`), 
UNIQUE KEY `email` (`email`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 
+5

cette question ressemble beaucoup: http: // stackoverflow.com/questions/1584825/changeant de-md5-à-sha1-salant/1585305 et http://stackoverflow.com/questions/1581610/help-me-make-my-password-storage-safe/1581919# 1581919 – Jacco

+0

Vous pourriez améliorer en n'utilisant pas MD5 comme algorithme de hachage. Y a-t-il une raison pour laquelle vous avez choisi celui-là? – mrduclaw

+0

"plus sûr" à quel égard? voir http://stackoverflow.com/questions/420843/421147#421147 – hop

Répondre

4

Je ne voudrais pas utiliser l'adresse e-mail dans le hachage du mot de passe. Si une personne change son adresse e-mail, le mot de passe haché est invalidé et l'utilisateur doit donc changer son mot de passe chaque fois qu'il change d'adresse e-mail. J'utilise généralement un sel par utilisateur et un sel par application (fixé pour tous les utilisateurs). De cette façon, un attaquant aurait besoin d'accéder à la fois à votre application et à votre base de données utilisateur pour y accéder.

$hashed = md5($per_user_salt . $password . $app_salt); 
+2

Je n'utiliserais pas MD5 – Jacco

+2

Moi non plus, mais d'autres réponses avaient déjà mentionné ce problème et j'en ai donc parlé différemment. – tvanfosson

-1

Ils ne coïncideront jamais.

.... peut-être une fois dans 10000000000000000.

+2

Cela ne semble pas mathématiquement correct. Puis-je voir des statistiques qui prennent en charge ce nombre? – mrduclaw

+3

suis-je le seul qui a lu ce nombre comme binaire? >. < – Pondidum

+0

peut-être? Pour 500000000 sels pris dans l'intervalle 0-2^32, le risque de collision est supérieur à 30%. – xtofl

13

Il n'a pas d'importance si elles entrent en collision. Le but du sel est que si vous hachez deux fois la même valeur mais avec des sels différents, le résultat sera différent. Si l'attaquant acquiert des bases de hachages, le sel rendra inefficace l'attaque avec une base de données pré-calculée de hashs connus. Le sel lui-même n'est pas un secret et les collisions de sels ne sont pas un problème.

+0

Les collisions salines sont un problème très mineur dans la mesure où elles vous permettent de travailler en parallèle vers la brute-forçant les mots de passe qui partagent le même sel. Personnellement, cependant, je suis d'accord que ce n'est pas quelque chose dont vous avez vraiment besoin de s'inquiéter. L'exposition accrue qu'il crée (au moins un sel alphanumérique à deux caractères) est si petite que votre temps est mieux utilisé pour augmenter une autre partie de l'architecture de sécurité. –

3

getrandmax semble retourner un nombre assez grand (2147483647), en fonction de votre plate-forme. La chance que vous rencontrez un N donné est donc 1/2147483647.

La probabilité que vous ne rencontriez pas N est 1-1/2147483647.

donc la chance que vous ne rencontrez pas le premier, en second lieu, en troisième lieu, ... Pth N devient la puissance pième (1-1/2147483647).

donc la chance que vous faites rencontre l'un des sels distribués P est 1 - (chance que vous ne rencontrez pas de sels P)

= 1 - (1-1/max) ** P

Cela signifie une courbe qui descend abruptement d'environ un quart de gig de sels. (une table à partir d'Excel):

     max 
          2,147,483,647 
      P = number/salts  (1 - 1/max)^P  collission chance 
       16777216     0     1% 
       33554432     0     2% 
       67108864     0     3% 
       134217728     0     6% 
       268435456     0     12% 
       536870912     0     22% 
      1073741824     0     39% 
      2147483648     0     63% 
      4294967296     0     86% 
      8589934592     0     98% 
      17179869184     0     100% 
0

Vous pouvez également envisager d'utiliser SHA256, nous voyons de plus en plus les exploits avec MD5. SHA256 nécessitera un espace de stockage supplémentaire en raison de la longueur des résultats de hachage, mais je pense que cela en vaut la peine.

$ = hachage haché ('SHA256', per_user_salt $ password $ app_salt de $..);

Note: cela ne nécessite PHP 5.1.2 ou plus.

Questions connexes