Comparer les mots de passe avec crypt () en PHP
J'ai besoin d'obtenir les notions de base de cette fonction. L'php.net états de documentation, pour l'algorithme blowfish, que:
Blowfish hachage avec un sel comme suit: "$2a$", deux chiffres coût de paramètre, "$", et 22 de la base de 64 chiffres de l'alphabet "./0-9A-Za-z". En utilisant des caractères en dehors de cette plage dans le sel sera la cause de crypt() pour renvoyer une chaîne de longueur nulle
Donc, par définition, ne devraient pas travailler:
echo crypt('rasmuslerdorf', '$2a$07$usesomadasdsadsadsadasdasdasdsadesillystringforsalt$');
Cependant, il crache:
$2a$07$usesomadasdsadsadsadaeMTUHlZEItvtV00u0.kb7qhDlC0Kou9e
Où il semble que crypt() a réduit le sel lui-même à une longueur de 22. Quelqu'un pourrait m'expliquer pourquoi?
Un autre aspect de cette fonction, je ne peux pas obtenir ma tête autour de est lorsqu'ils utilisent crypt() pour comparer les mots de passe. http://php.net/manual/en/function.crypt.php (voir ex. #1). Est-ce à dire que si j'utilise le même sel pour tout le cryptage de tous mes mots de passe, j'ai de la crypte il en premier? c'est à dire:
$salt = "usesomadasdsadsadsadae";
$salt_crypt = crypt($salt);
if (crypt($user_input, $salt) == $password) {
//FAIL WONT WORK
}
if (crypt($user_input, $salt_crypt) == $password) {
//I HAVE TO DO THIS?
}
Merci pour votre temps
source d'informationauteur soren.qvist
Vous devez vous connecter pour publier un commentaire.
Exemple de code suivant peut répondre à vos questions.
Pour générer de hachage de mot de passe à l'aide de Blowfish, vous devez d'abord générer un sel, qui commence par $2a$, suivi par le nombre d'itérations et de 22 caractères de la chaîne Base64.
Stocker l'ensemble $digest dans la base de données, il a à la fois le sel et le digérer.
Lorsque l'on compare le mot de passe, il suffit de faire cela,
Vous réutilisez le digérer comme le sel. crypte sait combien de temps est le sel de l'identifiant de l'algorithme.
Citant le manuel
Remarque: 22 de la base de 64 chiffres
BCrypt utilise 128 bits pour le sel, donc 22 octets Base64, avec seulement deux bits du dernier octet utilisé.
Le hash est calculé en utilisant le sel et le mot de passe. Lorsque vous passez le mot de passe crypté, l'algorithme lit de la force, le sel (en ignorant tout ce qui au-delà), et le mot de passe que vous avez donné, et calcule le hachage, l'ajout d'elle. Si vous avez PostgreSQL et pg_crypto à portée de main, SÉLECTIONNEZ gen_salt('bf'); va vous montrer ce qu' $le sel est en cours de lecture.
Voici un exemple de code pour le sel de la génération, à partir de mon .NET de la mise en œuvre's test-vector-gen.php sinon:
Il n'y a pas de raison d'utiliser le même sel pour l'ensemble de vos mots de passe. Le sel fait partie de la sortie de toute façon si vous ne gagnez rien en confort... mais je vous l'accorde PHP doit avoir un construit-dans gen_salt fonction.
Nouveau sel pour chaque mot de passe
Authentification
Première question:
Il n'y a pas un problème d'avoir trop de personnages... la phrase en Utilisant des caractères en dehors de cette plage dans le sel sera la cause de crypt() pour renvoyer une chaîne de longueur nulle referse à l'extérieur de la plage de base 64 pas de la plage de 22 caractères. Essayez de mettre un caractère illégal dans le sel de la chaîne, et vous devriez trouver que vous obtenez une sortie vide (ou, si vous mettez < 22 caractères en illégales vide octets).
Deuxième question:
Vous passez dans le chiffrées stockées mot de passe comme le sel, car le sel de la chaîne apparaît toujours (par conception) dans la chaîne cryptée, et de cette façon vous assurer que vous avez le même sel pour le chiffrement de la stockées utilisateur et mot de passe saisi.
Cette question est par rapport à ma réponse à ZZ Coder la réponse. Fondamentalement, ma question est concernant le stockage de la crypte() le résultat dans la base de données. Suis-je censé stocker la totalité de sortie dans la base de données, de sorte que ma base de données ressemble à ceci:
Si oui, puis n'est-ce pas ce genre de défier le but de l'utilisation d'un sel en premier lieu? Si quelqu'un a accès à la db, ils peuvent voir clairement le sel utilisé pour le cryptage?
Question Bonus: Est-il sécuritaire d'utiliser le même sel pour chaque mot de passe?