2009-10-27 5 views
3

En supposant que nous avons un sel qui est dans la base de données et qui a été généré comme celui-ciComment ces 2 lignes de PHP sont-elles différentes?

$salt = time();

Quelle est la différence entre ces 2 lignes.

$pass1 = hash('sha1', $password . $salt); 

$pass2 = hash_hmac('sha1', $password, $salt); 

Ils ne produisent pas la même sortie. Le premier, la fonction hash prend 2 paramètres, tandis que le hash_hmac nécessite 3 paramètres. Vous pensez donc que nous pouvons obtenir ce troisième paramètre supplémentaire en utilisant le $salt séparément (pour remplir le troisième paramètre) au lieu de le concaténer avec le mot de passe ($password . $salt) comme nous l'avons fait dans la ligne 2. Mais ce n'est pas si simple, le 2 les résultats sont différents. Pourquoi? Que se passe-t-il exactement ici?

Répondre

15

Parce que HMAC SHA-1 n'est pas identique à SHA-1 avec le message et la clé concaténés. HMAC ressemble plus à sha1($salt . sha1($salt . $password)), mais pas exactement. Wikipedia a une belle description de HMAC.

+0

Je vois. Donc, lorsque vous utilisez HMAC, avez-vous toujours besoin de générer des sels aléatoires séparés pour chaque enregistrement à stocker dans la base de données? ou ne donnez-vous à HMAC qu'une chaîne standard, par ex. 'hash_hmac ('sha1', $ pass," standard ");' et aucun sel aléatoire n'est nécessaire? – Chris

+8

sel aléatoire sera nécessaire de toute façon pour se protéger contre les arc-en-tables. – Etan

+1

Merci Lukas et Etan. Éclairci maintenant. – Chris

Questions connexes