Quanto dura l'hash SHA256?


248

Ho intenzione di eseguire SHA256una password + salt, ma non so quanto tempo impiegherò VARCHARper configurare il database MySQL. Qual è una buona lunghezza?


9
Prima che chiunque legga questo decida di seguire questo consiglio e di usarlo SHA-*per le password di hash, PER FAVORE leggi prima questo .
c00000fd,

2
A meno che non si utilizzi SHA-256 su password, cosa che non si dovrebbe fare, gli hash hanno una lunghezza di 256 bit, 64 caratteri esadecimali, 43 caratteri alfanumerici o 32 byte.
Caw

Risposte:


337

Uno sha256 è lungo 256 bit - come indica il nome.

Poiché sha256 restituisce una rappresentazione esadecimale, sono sufficienti 4 bit per codificare ciascun carattere (anziché 8, come per ASCII), quindi 256 bit rappresenterebbero 64 caratteri esadecimali, quindi è necessario un varchar(64), o addirittura un char(64), poiché la lunghezza è sempre la stessa , non varia affatto.

E la demo:

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

Ti darà:

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

cioè una stringa con 64 caratteri.


7
possiamo usare char (64) come chiave primaria o sarà binario (32) migliore per quello? (access_token)
franco

3
Se pensi di voler bloccare un utente in futuro, allora ti suggerisco di usarlo varchar(65)come leader !... solo per dirlo.
Manatax

105
... o semplicemente aggiungi una colonna "bloccata"?
Stijn de Witt,

5
Se vuoi avere un valore diverso per ogni password, devi memorizzarlo accanto all'hash. Per questo puoi usare un campo extra o pre / aggiungerlo all'hash, quindi avrai bisogno di più di 64 caratteri
Patrick Cornelissen,

4
puoi usare questa istruzione select per testarla: SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))è sempre 44 qualunque sia la lunghezza della stringa originale.
DrAhmedJava,

72

Opzioni di codifica per i 256 bit di SHA256:

  1. Base64: 6 bit per carattere = CHAR(44)incluso carattere di riempimento
  2. Esadecimale: 4 bit per carattere = CHAR(64)
  3. Binario: 8 bit per byte = BINARY(32)

30
Base64 è 3 byte per 4 caratteri, quindi, anche se 32 byte si inserisce in 43 caratteri, è effettivamente bisogno 44. Un extra = viene aggiunto come il carattere finale
Wilco

2
Bene, il = può essere rimosso e aggiunto di nuovo.
Rick James

28

Preferisco usare BINARY (32) poiché è il modo ottimizzato!

È possibile inserire in quelle 32 cifre esadecimali da (00 a FF).

Pertanto BINARY (32)!


8
+1 - Mi piace ottimizzato ... per chiunque altro accada su questo ... per usare questo con MySQL ... puoi usare UPDATE...SET hash_column=UNHEX(sha256HexString). Quindi, quando lo recuperi, tu SELECT HEX(hash_column) AS hash_column.
Kevin Nelson,

22

Perché dovresti farlo VARCHAR? Non varia. Sono sempre 64 caratteri, che possono essere determinati eseguendo qualsiasi cosa in uno dei calcolatori SHA-256 online .


char (64) è un'istruzione mysql valida?
Tony Stark,

28
@hatorade: No, non è un'istruzione, ma è un tipo di colonna valido.
Mark Byers,

10
varchar inoltre non alloca spazio a meno che non sia usato, a differenza del carattere alloca il numero di caratteri totali consentiti indipendentemente dal fatto che vi siano dati che lo riempiono.
Xenland,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.