2010-02-03 9 views
9

J'étais ici hier et j'ai eu de très bonnes réponses. J'ai pris ce que j'ai obtenu et mis ensemble, ce que je pense sera un algorithme assez sécurisé. J'ai un problème en utilisant blowfish avec une boucle for qui génère le sel. J'utilise des caractères de base64 et une boucle for pour obtenir une chaîne aléatoire. Je veux prendre cette chaîne générée et l'insérer dans la fonction crypt comme le sel. Parce que la documentation sur blowfish est si parcimonieuse et que les docs PHP ne la mentionnent pas vraiment, je suis en train de poignarder dans le noir ici.PHP crypte et sel - plus de clarification s'il vous plaît

La chose vraiment étrange est que si vous exécutez ce code comme il est maintenant, il va pas échouer. Enlevez soit '$ 2a $ 07 $' au-dessus de la boucle for ou de la fonction crypt et retournent par intermittence une chaîne cryptée. Ma compréhension de blowfish est que la chaîne chiffrée doit commencer par '$ 2a $ 07 $' et se terminer par "$ 'd'où la concaténation dans la fonction crypt.Je n'ai vraiment pas besoin de la chaîne de début au-dessus de la boucle for et je voulais pour se débarrasser de celui-ci.

Je voudrais également des précisions sur les meilleures pratiques sur le stockage du sel aléatoire, soit dans la base de données ou en stockant la sortie de la fonction crypte dans la base de données?

Hier, Il n'y avait pas de vrai code, juste une discussion, je voudrais mettre du code ensemble aujourd'hui et avoir quelque chose qui est assez sûr en place Si quelqu'un peut trouver un meilleur algorithme, je suis toujours ope n.

$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'; 
$salt = '$2a$07$'; 

for($i=0; $i<60; $i++) 
{ 
    $salt .= $base64[rand(0,63)]; 
} 

return crypt('password', '$2a$07$'.$salt.'$'); 
+0

Vous ajoutez 2 $ à $ 07 $ 'deux fois la valeur du sel, est-ce intentionnel? – meagar

+0

Oui. C'est pourquoi je poste. Si vous supprimez l'une de ces chaînes, la fonction crypt retournera une chaîne cryptée de manière aléatoire. Je voudrais enlever la chaîne au-dessus de la boucle for et garder la chaîne dans la fonction crypt. Lorsque je l'enlève, la fonction crypt échoue. – timmay

+0

Si vous exécutez ce code tel qu'il est, il n'échouera pas. Retirez l'une de ces chaînes $ 2a $ 07 $ et elle échoue. – timmay

Répondre

3

Il semble que les crypt() aversions + omble chevalier dans le sel, et beaucoup d'autres caractères spéciaux ainsi (*, % etc). Si vous les filtrez, cela devrait fonctionner à chaque tentative (et pas besoin de répéter la chaîne de sel id).

+0

Je ne sais pas pourquoi cela fonctionne si vous ajoutez deux fois l'identifiant de sel, mais peut-être que l'un des $ dans le second id fait cesser d'analyser le sel après cela ou similaire. > _ < –

+0

Wow kb, tu as raison. Il n'a pas échoué une fois. Je viens de supprimer les deux derniers caractères de la chaîne base64. – timmay

+0

Merci mon ami. – timmay

3

Je sais que cette question est l'histoire pratiquement ancienne maintenant, mais au profit de ceux qui trouvent en effectuant une recherche google, il y a une description assez détaillée de la façon dont les sels Bcrypt/EksBlowfish travaillent dans la réponse à cette question:

Why does crypt/blowfish generate the same hash with two different salts?

la réponse est, en tant que ledit café, il utilise un alphabet base64 composé de [a-zA-Z0-9./], avec $ comme nulle (0), se terminant/caractère de remplissage. Si vous utilisez des caractères en dehors de cette plage, ou un $ trop tôt, il sera soit par erreur ou ne pas interpréter l'intégralité du sel.