¿Cuánto dura el hash SHA256?


248

Voy a ejecutar SHA256con una contraseña + salt, pero no sé cuánto tiempo debo hacer VARCHARal configurar la base de datos MySQL. ¿Qué es una buena longitud?


99
Antes de que alguien que lea esto decida seguir este consejo y usarlo SHA-*para hacer hash de contraseñas, LEA esto primero .
c00000fd

2
A menos que esté utilizando SHA-256 en contraseñas, lo que no debe hacer, los hashes tienen una longitud de 256 bits, o 64 caracteres hexadecimales, o 43 caracteres alfanuméricos, o 32 bytes.
caw

Respuestas:


337

Un sha256 tiene 256 bits de longitud, como su nombre lo indica.

Como sha256 devuelve una representación hexadecimal, 4 bits son suficientes para codificar cada carácter (en lugar de 8, como para ASCII), por lo que 256 bits representarían 64 caracteres hexadecimales, por lo tanto, necesita un varchar(64), o incluso un char(64), ya que la longitud es siempre la misma , sin variar en absoluto.

Y la demo:

$hash = hash('sha256', 'hello, world!');
var_dump($hash);

Te regalaré :

$ php temp.php
string(64) "68e656b251e67e8358bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728"

es decir, una cadena con 64 caracteres.


77
¿podemos usar char (64) como clave principal o binario (32) será mejor para eso? (access_token)
franco

3
Si crees que podrías querer bloquear a un usuario en el futuro, entonces sugiero usarlo varchar(65)como líder !... solo diciendo.
Manatax

105
... o simplemente agrega una columna 'bloqueada'?
Stijn de Witt

55
Como desea tener una sal diferente para cada contraseña, debe almacenarla junto al hash. Para esto, puede usar un campo adicional o pre / agregarlo al hash, por lo que necesitará más de 64 caracteres
Patrick Cornelissen

44
puede usar esta instrucción select para probarla: SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))siempre es 44, independientemente de la longitud de la cadena original.
DrAhmedJava

72

Opciones de codificación para los 256 bits de SHA256:

  1. Base64: 6 bits por carácter = CHAR(44)incluido el carácter de relleno
  2. Hex: 4 bits por char = CHAR(64)
  3. Binario: 8 bits por byte = BINARY(32)

30
Base64 es de 3 bytes por 4 caracteres, por lo que a pesar de que 32 bytes se ajustan a 43 caracteres, en realidad necesita 44. Se agrega un carácter extra = como carácter final
Wilco

2
Bueno, =se puede quitar y volver a agregar.
Rick James

28

¡Prefiero usar BINARY (32) ya que es la forma optimizada!

Puede colocar en esos 32 dígitos hexadecimales de (00 a FF).

¡Por lo tanto BINARIO (32)!


8
+1 - Me gusta optimizado ... para cualquier persona que esté pasando esto ... para usar esto con MySQL ... puedes usarlo UPDATE...SET hash_column=UNHEX(sha256HexString). Entonces, al recuperarlo, tú SELECT HEX(hash_column) AS hash_column.
Kevin Nelson

22

¿Por qué lo harías VARCHAR? No varía Siempre son 64 caracteres, que se pueden determinar ejecutando cualquier cosa en una de las calculadoras SHA-256 en línea .


¿es char (64) una declaración válida de mysql?
Tony Stark

28
@hatorade: No, no es una declaración, pero es un tipo de columna válido.
Mark Byers

10
varchar tampoco asigna espacio a menos que se use, a diferencia de char, asigna la cantidad de caracteres totales permitidos, independientemente de si hay datos que lo llenen.
Xenland

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.