Saltar al contenido

¿Qué tipo de datos usar para el campo de contraseña hash y qué longitud?

Presta atención porque en esta división vas a hallar la respuesta que buscas.Esta reseña fue probado por nuestros expertos para garantizar la calidad y veracidad de nuestro post.

Solución:

Actualización: el simple hecho de usar una función hash no es lo suficientemente fuerte para almacenar contraseñas. Debería leer la respuesta de Gilles en este hilo para obtener una explicación más detallada.

Para contraseñas, use un key-Algoritmo hash de refuerzo como Bcrypt o Argon2i. Por ejemplo, en PHP, use la función password_hash (), que usa Bcrypt por defecto.

$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

El resultado es un 60 caracteres string similar al siguiente (pero los dígitos variarán, porque genera una sal única).

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Utilice el tipo de datos SQL CHAR(60) para almacenar esta codificación de un hash Bcrypt. Tenga en cuenta que esta función no se codifica como string de dígitos hexadecimales, por lo que no podemos deshacerlo fácilmente para almacenarlo en binario.

Otras funciones hash todavía tienen usos, pero no para almacenar contraseñas, así que mantendré la respuesta original a continuación, escrita en 2008.


Depende del algoritmo hash que utilice. El hash siempre produce un resultado de la misma longitud, independientemente de la entrada. Es típico representar el resultado hash binario en texto, como una serie de dígitos hexadecimales. O puede usar el UNHEX() función para reducir un string de dígitos hexadecimales a la mitad.

  • MD5 genera un valor hash de 128 bits. Puede utilizar CHAR (32) o BINARY (16)
  • SHA-1 genera un valor hash de 160 bits. Puede usar CHAR (40) o BINARY (20)
  • SHA-224 genera un valor hash de 224 bits. Puede utilizar CHAR (56) o BINARY (28)
  • SHA-256 genera un valor hash de 256 bits. Puede utilizar CHAR (64) o BINARY (32)
  • SHA-384 genera un valor hash de 384 bits. Puede utilizar CHAR (96) o BINARY (48)
  • SHA-512 genera un valor hash de 512 bits. Puede utilizar CHAR (128) o BINARY (64)
  • BCrypt genera un valor hash de 448 bits dependiente de la implementación. Es posible que necesite CHAR (56), CHAR (60), CHAR (76), BINARY (56) o BINARY (60)

A partir de 2015, NIST recomienda usar SHA-256 o superior para cualquier aplicación de funciones hash que requieran interoperabilidad. Pero el NIST no recomienda el uso de estas simples funciones hash para almacenar contraseñas de forma segura.

Los algoritmos de hash menores tienen sus usos (como internos a una aplicación, no para el intercambio), pero se sabe que se pueden descifrar.

Utilice siempre un algoritmo de hash de contraseña: Argon2, scrypt, bcrypt o PBKDF2.

Argon2 ganó el concurso de hash de contraseñas de 2015. Scrypt, bcrypt y PBKDF2 son algoritmos más antiguos que se consideran menos preferidos ahora, pero siguen siendo fundamentalmente sólidos, por lo que si su plataforma aún no es compatible con Argon2, está bien usar otro algoritmo por ahora.

Nunca almacene una contraseña directamente en una base de datos. Tampoco lo cifre: de lo contrario, si su sitio es violado, el atacante obtiene el descifrado key y así puede obtener todas las contraseñas. Las contraseñas DEBEN ser Troceado.

A hash de contraseña tiene propiedades diferentes de un hash de tabla hash o un hash criptográfico. Nunca use un hash criptográfico ordinario como MD5, SHA-256 o SHA-512 en una contraseña. Un algoritmo de hash de contraseña utiliza un sal, que es único (no se utiliza para ningún otro usuario ni en la base de datos de nadie más). La sal es necesaria para que los atacantes no puedan simplemente calcular previamente los valores hash de las contraseñas comunes: con una sal, tienen que reiniciar el cálculo para cada cuenta. Un algoritmo de hash de contraseña es intrínsecamente lento – tan lento como puedas permitirte. La lentitud lastima al atacante mucho más que a ti porque el atacante tiene que probar muchas contraseñas diferentes. Para obtener más información, consulte Cómo cifrar las contraseñas de forma segura.

Un hash de contraseña codifica cuatro piezas de información:

  • Un indicador de qué algoritmo se utiliza. Esto es necesario para la agilidad: las recomendaciones criptográficas cambian con el tiempo. Debe poder realizar la transición a un nuevo algoritmo.
  • Un indicador de dificultad o dureza. Cuanto mayor sea este valor, más cálculo se necesitará para calcular el hash. Este debería ser un valor de configuración constante o global en la función de cambio de contraseña, pero debería aumentar con el tiempo a medida que las computadoras se vuelven más rápidas, por lo que debe recordar el valor para cada cuenta. Algunos algoritmos tienen un solo valor numérico, otros tienen más parámetros allí (por ejemplo, para ajustar el uso de la CPU y el uso de RAM por separado).
  • La sal. Dado que la sal debe ser única a nivel mundial, debe almacenarse para cada cuenta. La sal debe generarse aleatoriamente en cada cambio de contraseña.
  • El hash propiamente dicho, es decir, la salida del cálculo matemático en el algoritmo de hash.

Muchas bibliotecas incluyen un par de funciones que empaquetan convenientemente esta información como un string: uno que toma el indicador de algoritmo, el indicador de dureza y la contraseña, genera una sal aleatoria y devuelve el hash completo string; y uno que lleva una contraseña y el hash completo string como entrada y devuelve un booleano que indica si la contraseña era correcta. No existe un estándar universal, pero una codificación común es

$algorithm$parameters$salt$output

dónde algorithm es un número o un alfanumérico corto string codificar la elección del algoritmo, parameters es un imprimible string, y salt y output están codificados en Base64 sin terminar =.

16 bytes son suficientes para la sal y la salida. (Consulte, por ejemplo, las recomendaciones para Argon2). Codificado en Base64, tiene 21 caracteres cada uno. Las otras dos partes dependen del algoritmo y los parámetros, pero lo habitual es de 20 a 40 caracteres. Eso es un total de alrededor de 82 caracteres ASCII (CHAR(82), y sin necesidad de Unicode), al que debe agregar un margen de seguridad si cree que será difícil ampliar el campo más adelante.

Si codifica el hash en un formato binario, puede reducirlo a 1 byte para el algoritmo, 1 a 4 bytes para la dureza (si codifica algunos de los parámetros) y 16 bytes cada uno para la sal y la salida. , para un total de 37 bytes. Decir 40 bytes (BINARY(40)) para tener al menos un par de bytes libres. Tenga en cuenta que estos son bytes de 8 bits, no caracteres imprimibles, en particular, el campo puede incluir null bytes.

Tenga en cuenta que la longitud del hash no tiene ninguna relación con la longitud de la contraseña.

Realmente puedes usar CHAR(longitud del hash) para definir su tipo de datos para MySQL porque cada algoritmo hash siempre evaluará el mismo número de caracteres. Por ejemplo, SHA1 siempre devuelve un número hexadecimal de 40 caracteres.

Reseñas y calificaciones del artículo

Al final de la post puedes encontrar las acotaciones de otros programadores, tú asimismo puedes insertar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *