¿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?

Tony Stark
fuente
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.

Pascal MARTIN
fuente
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)
RickNZ
fuente
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)!

marctrem
fuente
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 .

ceejayoz
fuente
¿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
6

Se corregirá 64 caracteres, así que use char(64)

Noushad
fuente
Y uso CHARACTER SET ascii.
Rick James