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


No estoy seguro de cómo funciona el hashing de contraseñas (lo implementaré más adelante), pero necesito crear un esquema de base de datos ahora.

Estoy pensando en limitar las contraseñas a 4-20 caracteres, pero según tengo entendido después de cifrar la cadena hash será de diferente longitud.

Entonces, ¿cómo almacenar estas contraseñas en la base de datos?

Author: jww, 2008-10-29

9 answers

Depende del algoritmo de hash que utilices. 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 puedes usar el UNHEX() función para reducir a la mitad una cadena de dígitos hexadecimales.

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

NIST recomienda usar SHA-256 o superior para contraseñas. Los algoritmos de hash menores tienen sus usos, pero se sabe que son crackables.

Debes salar tus contraseñas antes de aplicar la función hash. Salar una contraseña no afecta la longitud del resultado hash.

 409
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:30

Puede usar CHAR(longitud de 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.

 15
Author: Noah Goodrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 15:53:24

Como una cadena de longitud fija (VARCHAR(n) o como lo llame MySQL). Un hash siempre tiene una longitud fija de, por ejemplo, 12 caracteres (dependiendo del algoritmo hash que utilice). Así que un 20 char contraseña se reduciría a un 12 char hash, y un 4 char contraseña, también obtendríamos un 12 char hash.

 8
Author: Treb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 15:47:20

Puede que este artículo de Wikipedia sobre salazón valga la pena. La idea es agregar un conjunto de datos para aleatorizar su valor hash; esto protegerá sus contraseñas de ataques de diccionario si alguien obtiene acceso no autorizado a los hashes de contraseña.

 8
Author: Dana the Sane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 15:50:12

Los hashes son una secuencia de bits (128 bits, 160 bits, 256 bits, etc. dependiendo del algoritmo). Su columna debe ser de tipo binario, no de texto / caracteres, si MySQL lo permite (el tipo de datos de SQL Server es binary(n) o varbinary(n)). También debes salar los hashes. Las sales pueden ser texto o binario, y necesitará una columna correspondiente.

 3
Author: yfeldblum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 15:59:51

Realmente depende del algoritmo de hash que estés usando. La longitud de la contraseña tiene poco que ver con la longitud del hash, si no recuerdo mal. Busque las especificaciones del algoritmo de hash que está utilizando, ejecute algunas pruebas y trunque justo por encima de eso.

 2
Author: willasaywhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 15:54:33

Para md5 es apropiado vARCHAR(32). Para aquellos que usan AES es mejor usar varbinary.

 2
Author: Hare Srinivasa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-29 07:05:52

Siempre he probado para encontrar la longitud MÁXIMA de cadena de una cadena cifrada y establecer que como la longitud de caracteres de un tipo VARCHAR. Dependiendo de cuántos registros vas a tener, realmente podría ayudar al tamaño de la base de datos.

 1
Author: Stephen Walcher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 15:48:06

Debe usar TEXT (almacenando un número ilimitado de caracteres) en aras de la compatibilidad hacia adelante. Los algoritmos de hash (necesitan) hacerse más fuertes con el tiempo y, por lo tanto, este campo de base de datos necesitará admitir más caracteres con el tiempo. Además, dependiendo de su estrategia de migración, es posible que necesite almacenar hashes nuevos y antiguos en el mismo campo, por lo que no se recomienda fijar la longitud a un tipo de hash.

 1
Author: bart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 22:32:03