2013-01-15 2 views
5

C'est la première fois que j'utilise la fonction crypt() en PHP, et je n'arrive pas à comprendre pourquoi ça ne marche pas. Mon code est basé sur cet article: http://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274PHP crypt() Blowfish Fonction ne fonctionne pas

function blowfishHash ($pw) { 
    //generate random salt 
    $salt = "$2y$10$"; 
    for ($i = 0; $i < 22; $i++) { 
     $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", mt_rand(0, 63), 1); 
    } 
    $hash = crypt($pw, $salt); 

    //printout to file 
    $file = fopen("debug.txt", "w+"); 
    fwrite($file, "\n\n\n".$pw); 
    fwrite($file, "\n\n\n".$salt); 
    fwrite($file, "\n\n\n".$hash); 
    fclose($file); 

    return $hash; 
} 

J'ai appelé la fonction avec le mot de passe de l'échantillon « mot de passe ».

Le sel résultant était: $2y$10$NzRQNjTRfP4jXKvb4TCO.G
Mais le mot de passe était "$2mV0NZp92R3g" - ce qui semble beaucoup trop court.

Quelqu'un pourrait m'aider à comprendre ce que je fais mal?

+0

J'ai testé votre exemple et il sort exactement le même que dans l'article. Comment éditer/déboguer le mot de passe $. Sur un site Web? par cli? – hek2mgl

+0

Je viens d'imprimer dans un fichier (j'ai omis les lignes de code pour cela). Existe-t-il une version spécifique de PHP requise pour cette fonction ...? – user1403777

+0

Quelle version utilisez-vous? (J'utilise: 5.3.10-1ubuntu3.4) – hek2mgl

Répondre

2

Comme vous l'avez indiqué dans votre commentaire, vous utilisez PHP 5.2.x.

L'implémentation de Blowfish est uniquement disponible en PHP> = 5.3.x. Si pour une raison quelconque, il n'est pas possible d'installer une version plus récente de PHP, vous pouvez vérifier here pour plus d'informations sur la façon de faire fonctionner Blowfish avec des versions plus anciennes de PHP.

+0

user1403777 est-ce que cela résout votre problème, ne répond pas en aucune façon aux réponses n'est pas la bonne façon de se comporter sur stackoverflow ... –

1

Depuis crypt dans PHP 5.2 ne supporte pas CRYPT_BLOWFISH, il est à la place par défaut d'interpréter le sel comme un sel de style CRYPT_DES. Notez que la sortie commence avec "$ 2", qui est le sel de deux caractères que CRYPT_DES a choisi de l'entrée salt et ajouté au hash, et la longueur de sortie correspond à la longueur de sortie CRYPT_DES exacte. Il est intéressant de noter que vous pouvez obtenir le même résultat dans les versions ultérieures de PHP avec le support CRYPT_BLOWFISH en tronquant simplement le sel à deux caractères. À savoir:

crypt('password', '$2y$10$NzRQNjTRfP4jXKvb4TCO.G') /* in PHP 5.2 */ 
== 
crypt('password', '$2') /* in PHP 5.4 */ 

En théorie, cela pourrait être utile pour la compatibilité ascendante si un sel de style crypt_blowfish a été utilisé par erreur sur PHP 5.2.

Cela m'a vraiment causé un peu de confusion récemment parce que le caractère « $ » n'est pas entrée de sel valable pour CRYPT_DES comme par le PHP crypt documentation, qui dit:

standard hachage à base DES avec deux caractères sel de l'alphabet "./0-9A-Za-z". L'utilisation de caractères non valides dans le sel entraînera l'échec de crypt().

Mais ici le caractère "$" semble clairement être accepté par crypt() à la fois dans v5.2 et v5.4.

Il serait à la fois plus clair et plus sûr si crypt renvoyait une erreur comme la documentation l'indique, plutôt que d'accepter le "$" et la valeur par défaut de CRYPT_DES.

1

ici est ma fonction de cryptage Blowfish ....

<?php 
    function bcrypt($input, $salt=null, $rounds=12) { 
     if($rounds < 4 || $rounds > 31) $rounds = 12; 
     if(is_null($salt)) $salt = sprintf('$2a$%02d$', $rounds).substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22); 
     return crypt($input, $salt); 
    } 
    $hash = bcrypt('password'); 
    if($hash = bcrypt('password', $hash)) { 
     // password ok 
    } 

?> 
0

Dans un premier temps que Blowfish hachant avec un sel commençant par $2a$ a été pris en charge.

$2x$ et $2y$ Les modes Blowfish ont été ajoutés en PHP 5.3.7 pour gérer les attaques potentielles de haut-bit.

Votre PHP 5.2.17 ne supporte pas le mode $2y$ Blowfish.

Voici pourquoi votre code ne fonctionne pas.

Questions connexes