2012-05-20 3 views
1

Je suis en train de mettre à jour le niveau de sécurité de mon site.BCRYPT et Random SALTS ensemble dans la base de données

Lors de la recherche de la meilleure méthode pour stocker les mots de passe, j'ai trouvé l'option BCRYPT dans PHP 5.3. J'ai implémenté cette fonction pour utiliser un SALT statique, cependant j'ai lu que chaque mot de passe doit avoir un SALT différent ou qu'il va à l'encontre du but.

Dois-je stocker le fichier SALT dans la base de données avec l'enregistrement utilisateur en texte brut? Est-ce que cela va aussi à l'encontre du but? ou devrais-je hacher le sel en utilisant md5 et le stocker dans la base de données?

Quelle est la meilleure méthode lors de la mise en œuvre et de l'entreposage des SALT?

+0

Jetez un oeil à la bibliothèque [PHPass] (http://www.openwall.com/phpass/). Il offre une fonctionnalité drop-in pour le hachage de mot de passe avec BCrypt et est largement considéré comme une bonne bibliothèque sécurisée. Voir aussi: http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely – Jacco

Répondre

3

Le modular crypt format for bcrypt does already contain a 128 bit salt. Donc, à moins d'utiliser une implémentation différente de celle-ci, vous n'avez pas besoin d'un autre sel.

Notez que l'objectif principal d'un salt est de rendre chaque entrée unique afin que l'attaque de dictionnaire assistée par table de consultation contre les valeurs stockées soit impossible.


Jacco m'a rappelé que la mise en œuvre bcrypt natif de PHP dans crypt ne génère pas de sel automatiquement. Donc, vous devez le faire par vous-même, par exemple:

$salt = substr(str_replace('+', '.', base64_encode(call_user_func_array('pack', array_merge(array('H14N'), explode('.', uniqid('', true)))).pack('N2', mt_rand(), mt_rand()))), 0, 22); 
$hash = crypt($password, '$2a$10$'.$salt.'$'); 
+0

Les implémentations de BCyrpt en PHP ne créent malheureusement PAS automatiquement de sel. – Jacco

+0

@Jacco La fonction [password_hash()] (http://php.net/manual/fr/function.password-hash.php), nouvelle dans PHP 5.5, * ne * génère automatiquement le sel bcrypt. –

2

Vous devez créer un nouveau sel aléatoire pour chaque utilisateur et le stocker avec le hachage dans la base de données. La plupart des implémentations de bcrypt le font déjà. Si vous regardez la sortie, vous verrez que c'est une valeur séparée de $ contenant le sel.

+0

devrais-je encoder le sel avec MD5 pour plus de sécurité? Je comprends le fonctionnement du sel et du bcrypt. Im juste confus que lors du stockage du sel, il peut aider avec le mot de passe de fissuration – Ray

+0

Si vous hachez le sel avec MD5, vous ne serez pas en mesure de vérifier le mot de passe ... – CodesInChaos

+0

ne serais-je pas en mesure de comparer les chaînes en utilisant $ sel = md5 ($ row [salt]); $ check = crypt ($ row [mot de passe], $ salt); if ($ check == $ loginpass) { – Ray

Questions connexes