2012-11-25 3 views
4

Je viens de commencer à apprendre PHP et je veux créer un site web avec un identifiant pour mon projet d'université de dernière année. J'ai lu que Blowfish est la meilleure méthode pour le hachage dans plusieurs endroits comme ici: openssl_digest vs hash vs hash_hmac? Difference between SALT & HMAC?Comment générer automatiquement du sel pour la méthode crypt avec blowfish

Partout je lis au sujet de la méthode de la crypte comprend une chaîne comme $2y$07$usesomesillystringforsalt$ Ma question principale est: comment puis-je générer au hasard cela? J'ai lu dans des endroits où les horodatages et mt_rand() ne sont pas sécurisés.

J'ai aussi entendu dire que AES est la technologie préférée récemment, mais d'après ce que je peux voir, il semble assez difficile à mettre en œuvre en PHP! Le blowfish est-il toujours une méthode acceptable pour sécuriser les mots de passe stockés?

+2

Il n'est pas généré aléatoirement son $ 'algo $ cost $ salt $' où salt est son microtime parfaitement sûr d'utiliser apposé avec votre nom de domaine sha1'nd 'substr (salt, 0,21)' comme plus de 21 caractères être laissé tomber. Peut-être que quelque chose que j'ai fait tôt vous intéressera [php-pdo-secure-login-script-example] (https://code.google.com/p/php-pdo-secure-login-script-example/source/browse/ branches/index.php) –

Répondre

6

Un sel doit être unique, (pour chaque mot de passe) et imprévisible. Ces deux critères sont un peu difficiles à remplir avec un ordinateur déterministe, donc la meilleure chose à faire est d'utiliser la source aléatoire du système d'exploitation pour générer le sel.

Les horodatages, ainsi que la fonction mt_rand(), ne sont pas idéaux, car on peut prétendre qu'ils sont prévisibles. Au moins un attaquant peut affiner (et donc précalculer) les combinaisons possibles pendant une certaine période. Bien que cela n'ait pas beaucoup d'impact en pratique, pourquoi ne pas faire de votre mieux? Depuis PHP 5.3 vous pouvez utiliser en toute sécurité la fonction mcrypt_create_iv() pour lire à partir de la source aléatoire, puis vous devrez encoder la chaîne binaire dans l'alphabet autorisé. C'est un possible implementation.

PHP 5.5 aura ses propres fonctions password_hash() et password_verify() prêt, pour simplifier cette tâche. Il y a aussi un compatibility pack pour PHP 5.3/5.4 disponible, téléchargeable au password_compat.

3

Le poisson-mouche est toujours acceptable et préféré aux méthodes de hachage rapide.

Le but d'un salt est d'empêcher les attaques de tables précalculées. Tant que vous avez un sel non trivial, comme le microtime, vous avez contrecarré toutes les tables précalculées qui n'utilisaient pas ce sel exact.

+0

Ainsi, quelque chose ressemblerait-il à '$ password = crypt ($ _ POST [passward], '$ 2y $ 07 $'. microtime());' être OK? Merci pour votre aide – Connel

+0

@Connel Si syntaxiquement correct, oui. –

3

Pour la version PHP 5.3.7 ou plus je belive c'est le meilleur:

$blowfish_salt = "$2y$10$".bin2hex(openssl_random_pseudo_bytes(22)); 

Pour la version PHP 5.5 ou plus il suffit d'utiliser la nouvelle password_hash()function avec la création de sel automatique.

+0

Méfiez-vous les gars, bin2hex (openssl_random_pseudo_bytes (22)) retournera 44 caractères. Pour blowfish php, vous avez besoin de bin2hex (openssl_random_pseudo_bytes (11)) –

Questions connexes