Quiero almacenar una contraseña hash (usando BCrypt) en una base de datos. ¿Cuál sería un buen tipo para esto y cuál sería la longitud correcta? ¿Las contraseñas hash con BCrypt son siempre de la misma longitud?
EDITAR
Ejemplo hash:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
Después de cifrar algunas contraseñas, parece que BCrypt siempre genera 60 hashes de caracteres.
EDITAR 2
Perdón por no mencionar la implementación. Estoy usando jBCrypt .
Respuestas:
El formato de cripta modular para bcrypt consiste en
$2$
,$2a$
o$2y$
identificando el algoritmo y el formato hash$
.
,/
,0
-9
,A
-Z
,a
-z
que es diferente a la base estándar 64 Codificación alfabeto) que consiste en:Por lo tanto, la longitud total es de 59 o 60 bytes, respectivamente.
Cuando use el formato 2a, necesitará 60 bytes. Y por lo tanto para MySQL Voy a recomendar a utilizar el
CHAR(60) BINARY
oBINARY(60)
(ver El _bin y binarios colaciones para obtener información acerca de la diferencia).CHAR
no es binario seguro y la igualdad no depende únicamente del valor del byte sino de la recopilación real; en el peor de los casosA
se trata como igual aa
. Vea The_bin
andbinary
Collations para más información.fuente
SQL_Latin1_General_CP1_CS_AS
es desconocido en MySQL. Lo que se sabe eslatin1_general_cs
.2
,2a
y2y
media para el algoritmo de hash y el formato. No pude encontrar una respuesta fácil con algunas búsquedas.Un hash Bcrypt se puede almacenar en una
BINARY(40)
columna.BINARY(60)
, como sugieren las otras respuestas, es la opción más fácil y natural, pero si desea maximizar la eficiencia del almacenamiento, puede ahorrar 20 bytes al deconstruir el hash sin pérdidas. He documentado esto más a fondo en GitHub: https://github.com/ademarre/binary-mcfLos hash de Bcrypt siguen una estructura denominada formato de cripta modular (MCF). Binary MCF (BMCF) decodifica estas representaciones hash textuales en una estructura binaria más compacta. En el caso de Bcrypt, el hash binario resultante es de 40 bytes.
Gumbo hizo un buen trabajo al explicar los cuatro componentes de un hash Bcrypt MCF:
La decodificación a BMCF es así:
$<id>$
Se puede representar en 3 bits.<cost>$
, 04-31, se puede representar en 5 bits. Pon estos juntos por 1 byte.1 + 16 + 23
Puede leer más en el enlace de arriba, o examinar mi implementación de PHP , también en GitHub.
fuente
Si está utilizando PHP
password_hash()
con elPASSWORD_DEFAULT
algoritmo para generar el hash bcrypt (que supongo que es un gran porcentaje de personas que leen esta pregunta) asegúrese de tener en cuenta que en el futuropassword_hash()
podría usar un algoritmo diferente como predeterminado y esto podría afecta la longitud del hash (pero puede que no sea necesariamente más largo).Desde la página del manual:
Usando bcrypt, incluso si tiene mil millones de usuarios (es decir, actualmente está compitiendo con Facebook) para almacenar hashes de contraseñas de 255 bytes, solo necesitaría ~ 255 GB de datos, aproximadamente del tamaño de un disco duro SSD más pequeño. Es extremadamente improbable que almacenar el hash de contraseña sea el cuello de botella en su aplicación. Sin embargo, en caso de que el espacio de almacenamiento realmente sea un problema por alguna razón, puede usar
PASSWORD_BCRYPT
forzar elpassword_hash()
uso de bcrypt, incluso si ese no es el valor predeterminado. Solo asegúrese de mantenerse informado sobre las vulnerabilidades encontradas en bcrypt y revise las notas de la versión cada vez que se lance una nueva versión de PHP. Si alguna vez se cambia el algoritmo predeterminado, sería bueno revisar por qué y tomar una decisión informada sobre si usar el nuevo algoritmo o no.fuente
No creo que haya algunos trucos geniales que pueda hacer para almacenar esto, como puede hacer, por ejemplo, con un hash MD5.
Creo que su mejor opción es almacenarlo
CHAR(60)
ya que siempre tiene 60 caracteres de largofuente