Je souhaite stocker un mot de passe haché (à l'aide de BCrypt) dans une base de données. Quel serait un bon type pour cela, et quelle serait la bonne longueur? Les mots de passe hachés avec BCrypt sont-ils toujours de la même longueur?
ÉDITER
Exemple de hachage:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
Après avoir haché certains mots de passe, il semble que BCrypt génère toujours 60 hachages de caractères.
EDIT 2
Désolé de ne pas avoir mentionné l'implémentation. J'utilise jBCrypt .
Réponses:
Le format de cryptage modulaire pour bcrypt se compose de
$2$
,$2a$
ou$2y$
identifier l' algorithme et le format de hachage$
.
,/
,0
-9
,A
-Z
,a
-z
qui est différente de la norme de codage de base 64 alphabet) consistant en:Ainsi, la longueur totale est respectivement de 59 ou 60 octets.
Lorsque vous utilisez le format 2a, vous aurez besoin de 60 octets. Et donc pour MySQL je recommande d'utiliser le
CHAR(60) BINARY
ouBINARY(60)
(voir le _bin et binaires classements pour des informations sur la différence).CHAR
n'est pas binaire et l'égalité ne dépend pas uniquement de la valeur en octets mais du classement réel; dans le pire des casA
est traité comme égal àa
. Voir The_bin
etbinary
Collations pour plus d'informations.la source
SQL_Latin1_General_CP1_CS_AS
est inconnu dans MySQL. Ce qui est connu, c'estlatin1_general_cs
.2
,2a
et2y
moyenne pour l' algorithme de hachage et le format. Je n'ai pas pu trouver une réponse facile avec quelques recherches.Un hachage Bcrypt peut être stocké dans une
BINARY(40)
colonne.BINARY(60)
, comme les autres réponses le suggèrent, est le choix le plus simple et le plus naturel, mais si vous souhaitez maximiser l'efficacité du stockage, vous pouvez économiser 20 octets en déconstruisant sans perte le hachage. J'ai documenté cela plus en détail sur GitHub: https://github.com/ademarre/binary-mcfLes hachages Bcrypt suivent une structure appelée format de cryptage modulaire (MCF). Le MCF binaire (BMCF) décode ces représentations de hachage textuelles en une structure binaire plus compacte. Dans le cas de Bcrypt, le hachage binaire résultant est de 40 octets.
Gumbo a fait un bon travail pour expliquer les quatre composants d'un hachage Bcrypt MCF:
Le décodage vers BMCF va comme ceci:
$<id>$
peut être représenté en 3 bits.<cost>$
, 04-31, peut être représenté en 5 bits. Mettez-les ensemble pour 1 octet.1 + 16 + 23
Vous pouvez en savoir plus sur le lien ci-dessus, ou examiner mon implémentation PHP , également sur GitHub.
la source
Si vous utilisez PHP
password_hash()
avec l'PASSWORD_DEFAULT
algorithme pour générer le hachage bcrypt (qui, je suppose, est un grand pourcentage de personnes lisant cette question), assurez-vous de garder à l'esprit qu'à l'avenirpassword_hash()
, un algorithme différent pourrait être utilisé par défaut et que cela pourrait donc affecter la longueur du hachage (mais il ne peut pas nécessairement être plus long).Depuis la page de manuel:
En utilisant bcrypt, même si vous avez 1 milliard d'utilisateurs (c'est-à-dire que vous êtes actuellement en concurrence avec Facebook) pour stocker des hachages de mot de passe de 255 octets, cela ne ferait que ~ 255 Go de données - environ la taille d'un petit disque dur SSD. Il est extrêmement improbable que le stockage du hachage de mot de passe soit le goulot d'étranglement dans votre application. Cependant, dans le cas où l'espace de stockage est vraiment un problème pour une raison quelconque, vous pouvez utiliser
PASSWORD_BCRYPT
pour forcerpassword_hash()
à utiliser bcrypt, même si ce n'est pas la valeur par défaut. Assurez-vous simplement de rester informé des vulnérabilités trouvées dans bcrypt et de consulter les notes de publication à chaque fois qu'une nouvelle version PHP est publiée. Si l'algorithme par défaut est modifié, il serait bon de revoir pourquoi et de prendre une décision éclairée quant à l'utilisation ou non du nouvel algorithme.la source
Je ne pense pas qu'il existe des astuces intéressantes que vous pouvez faire pour stocker cela comme vous pouvez le faire par exemple avec un hachage MD5.
Je pense que votre meilleur pari est de le stocker
CHAR(60)
comme il est toujours de 60 caractèresla source