tipo para guardar encriptar desencriptar datos dato contraseñas contraseña como mysql hash types storage bcrypt

mysql - guardar - ¿Qué tipo/longitud de columna debo usar para almacenar una contraseña hash de Bcrypt en una base de datos?



tipo de dato para contraseña sql (4)

El formato de cripta modular para bcrypt consiste en

  • $2$ , $2a$ o $2y$ identifican el algoritmo y el formato de hash
  • un valor de dos dígitos que denota el parámetro de costo, seguido de $
  • un valor codificado en base a 64 caracteres de 53 caracteres (utilizan el alfabeto . , / , 0 - 9 , A - Z , a - z que es diferente al alfabeto de codificación de Base 64 estándar ) que consiste en:
    • 22 caracteres de sal (en realidad solo 128 bits de los 132 bits decodificados)
    • 31 caracteres de salida encriptada (en realidad solo 184 bits de los 186 bits decodificados)

Así, la longitud total es de 59 o 60 bytes respectivamente.

Cuando uses el formato 2a, necesitarás 60 bytes. Y, por lo tanto, para MySQL, recomiendo usar CHAR(60) BINARY o BINARY(60) (consulte The _bin y binary Kollings para obtener información sobre la diferencia).

CHAR no es seguro binario y la igualdad no depende únicamente del valor de byte sino de la intercalación real; en el peor de los casos, A se trata como igual a a . Ver Las _bin y binary para más información.

Quiero almacenar una contraseña con 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 con hash de BCrypt son siempre de la misma longitud?

EDITAR

Ejemplo de hash:

$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

Después de hashear algunas contraseñas, parece que BCrypt siempre genera 60 hashes de caracteres.

Editar 2

Lo siento por no mencionar la implementación. Estoy usando jBCrypt .


No creo que haya trucos ingeniosos que puedas hacer almacenando esto como puedes hacerlo, por ejemplo, con un hash MD5.

Creo que lo mejor es almacenarlo como CHAR(60) ya que siempre tiene 60 caracteres.


Si está usando password_hash() PHP con el algoritmo PASSWORD_DEFAULT para generar el hash bcrypt (que supongo que es un gran porcentaje de personas que leen esta pregunta), tenga en cuenta que en el futuro password_hash() podría usar un algoritmo diferente. como predeterminado y esto podría afectar la longitud del hash (pero no necesariamente puede ser más largo).

Desde la página del manual:

Tenga en cuenta que esta constante está diseñada para cambiar con el tiempo a medida que se agregan algoritmos nuevos y más sólidos a PHP. Por esa razón, la longitud del resultado de usar este identificador puede cambiar con el tiempo. Por lo tanto, se recomienda almacenar el resultado en una columna de la base de datos que pueda expandirse más allá de 60 caracteres (255 caracteres sería una buena opción).

Con bcrypt, incluso si tiene 1 billón de usuarios (es decir, actualmente está compitiendo con facebook) para almacenar hashes de contraseña de 255 bytes, solo tendría ~ 255 GB de datos, aproximadamente del tamaño de un disco duro SSD pequeño. Es extremadamente improbable que el almacenamiento del hash de la contraseña sea el cuello de botella en su aplicación. Sin embargo, en la remota posibilidad de que el espacio de almacenamiento realmente sea un problema por algún motivo, puede usar PASSWORD_BCRYPT para forzar a password_hash() a usar bcrypt, incluso si ese no es el valor predeterminado. Solo asegúrese de mantenerse informado sobre cualquier vulnerabilidad que se encuentre 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.


Un hash Bcrypt se puede almacenar en una columna BINARY(40) .

BINARY(60) , como sugieren las otras respuestas, es la opción más fácil y más natural, pero si desea maximizar la eficiencia del almacenamiento, puede ahorrar 20 bytes al deconstruir sin pérdida el hash. He documentado esto más a fondo en GitHub: https://github.com/ademarre/binary-mcf

Los hash de Bcrypt siguen una estructura denominada formato de cripta modular (MCF). Binary MCF (BMCF) decodifica estas representaciones de hash textuales a 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 de Bcrypt MCF:

$<id>$<cost>$<salt><digest>

La decodificación a BMCF es la siguiente:

  1. $<id>$ se puede representar en 3 bits.
  2. <cost>$ , 04-31, se puede representar en 5 bits. Poner estos juntos para 1 byte.
  3. La sal de 22 caracteres es una representación de base de 64 bits (no estándar) de 128 bits. La decodificación de base 64 produce 16 bytes.
  4. El resumen de hash de 31 caracteres se puede descodificar en base-64 a 23 bytes.
  5. Ponlo todo junto por 40 bytes: 1 + 16 + 23

Puede leer más en el enlace anterior o examinar mi implementación de PHP , también en GitHub.