Wie lang ist der SHA256-Hash?

244

Ich werde mit SHA256einem Passwort + Salt arbeiten, aber ich weiß nicht, wie lange ich es VARCHARbeim Einrichten der MySQL-Datenbank machen soll. Was ist eine gute Länge?

Tony Stark
quelle
9
Bevor sich jemand, der dies liest, dazu entschließt, diesen Rat zu befolgen und SHA-*Passwörter zu hashen, lesen Sie dies bitte zuerst .
c00000fd
2
Sofern Sie SHA-256 nicht für Kennwörter verwenden, was Sie nicht tun sollten, haben die Hashes eine Länge von 256 Bit oder 64 hexadezimalen Zeichen oder 43 alphanumerischen Zeichen oder 32 Bytes.
Caw

Antworten:

331

Ein sha256 ist 256 Bit lang - wie der Name schon sagt.

Da sha256 eine hexadezimale Darstellung zurückgibt, reichen 4 Bit aus, um jedes Zeichen zu codieren (anstelle von 8, wie bei ASCII). 256 Bit würden also 64 hexadezimale Zeichen darstellen. Daher benötigen Sie ein varchar(64)oder sogar ein char(64), da die Länge immer gleich ist überhaupt nicht variierend.

Und die Demo:

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

Werde dir geben :

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

dh eine Zeichenfolge mit 64 Zeichen.

Pascal MARTIN
quelle
7
Können wir char (64) als Primärschlüssel verwenden oder ist binär (32) dafür besser? (access_token)
Frankish
3
Wenn Sie glauben, dass Sie in Zukunft einen Benutzer blockieren möchten, schlage ich vor, ihn varchar(65)für einen führenden Benutzer zu verwenden !.
Manatax
103
... oder einfach eine Spalte 'blockiert' hinzufügen?
Stijn de Witt
5
Da Sie für jedes Passwort ein anderes Salt haben möchten, müssen Sie dieses neben dem Hash speichern. Hierfür können Sie ein zusätzliches Feld verwenden oder es vor / an den Hash anhängen, sodass Sie mehr als 64 Zeichen benötigen
Patrick Cornelissen
4
Sie können diese select-Anweisung verwenden, um sie zu testen: SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))Es ist immer 44, unabhängig von der Länge der ursprünglichen Zeichenfolge.
DrAhmedJava
72

Codierungsoptionen für die 256 Bit von SHA256:

  1. Base64: 6 Bits pro CHAR(44)Zeichen = einschließlich Füllzeichen
  2. Hex: 4 Bits pro Zeichen = CHAR(64)
  3. Binär: 8 Bits pro Byte = BINARY(32)
RickNZ
quelle
30
Base64 besteht aus 3 Bytes pro 4 Zeichen. Obwohl 32 Bytes in 43 Zeichen passen, benötigen Sie tatsächlich 44. Ein zusätzliches = wird als letztes Zeichen hinzugefügt
Wilco
2
Nun, das =kann abgestreift und wieder hinzugefügt werden.
Rick James
28

Ich bevorzuge BINARY (32), da dies der optimierte Weg ist!

Sie können in diese 32 hexadezimalen Ziffern von (00 bis FF) setzen.

Deshalb BINARY (32)!

marctrem
quelle
8
+1 - Ich mag optimiert ... für alle anderen, die dies tun ... um dies mit MySQL zu verwenden ... können Sie verwenden UPDATE...SET hash_column=UNHEX(sha256HexString). Dann, wenn Sie es abrufen, Sie SELECT HEX(hash_column) AS hash_column.
Kevin Nelson
22

Warum würdest du es VARCHAR machen? Es variiert nicht. Es sind immer 64 Zeichen, die ermittelt werden können, indem etwas in einen der Online-SHA-256-Rechner eingegeben wird .

ceejayoz
quelle
Ist char (64) eine gültige MySQL-Anweisung?
Tony Stark
28
@hatorade: Nein, es ist keine Anweisung, aber es ist ein gültiger Spaltentyp.
Mark Byers
10
varchar weist auch keinen Speicherplatz zu, es sei denn, es wird verwendet. Im Gegensatz zu char weist es die Anzahl der zulässigen Gesamtzeichen zu, unabhängig davon, ob Daten vorhanden sind, die es füllen.
Xenland
6

Es werden 64 Zeichen behoben, also verwenden char(64)

Noushad
quelle
Und verwenden CHARACTER SET ascii.
Rick James