Jak długo trwa skrót SHA256?

247

Zamierzam uruchomić SHA256hasło + sól, ale nie wiem, jak długo muszę to robić VARCHARpodczas konfigurowania bazy danych MySQL. Jaka jest dobra długość?

Tony Stark
źródło
9
Zanim ktokolwiek to przeczyta, zdecyduje się zastosować się do tej rady i użyć SHA-*hasła mieszającego, PROSZĘ przeczytaj to najpierw .
c00000fd
2
O ile nie używasz SHA-256 do haseł, czego nie powinieneś robić, skróty mają długość 256 bitów lub 64 znaków szesnastkowych lub 43 znaków alfanumerycznych lub 32 bajtów.
caw

Odpowiedzi:

335

Sha256 ma 256 bitów długości - jak wskazuje jego nazwa.

Ponieważ sha256 zwraca reprezentację szesnastkową, 4 bity wystarczą do zakodowania każdego znaku (zamiast 8, jak w ASCII), więc 256 bitów reprezentuje 64 znaki szesnastkowe, dlatego potrzebujesz varchar(64), a nawet a char(64), ponieważ długość jest zawsze taka sama , wcale się nie zmienia.

I demo:

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

Da tobie :

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

tzn. ciąg znaków o długości 64 znaków.

Pascal MARTIN
źródło
7
czy możemy użyć char (64) jako klucza podstawowego, czy może binarne (32) będzie do tego lepsze? (
access_token
3
Jeśli uważasz, że w przyszłości zechcesz zablokować użytkownika, sugeruję użyć słowa varchar(65)wiodącego !... po prostu mówiąc.
Manatax
103
... lub po prostu dodać kolumnę „zablokowaną”?
Stijn de Witt
5
Jeśli chcesz mieć inną sól dla każdego hasła, musisz przechowywać to obok skrótu. W tym celu możesz użyć dodatkowego pola lub wstępnie / dołączyć go do skrótu, więc będziesz potrzebować więcej niż 64 znaków
Patrick Cornelissen
4
możesz użyć tej instrukcji select do jej przetestowania: SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))zawsze ma ona wartość 44 bez względu na długość oryginalnego łańcucha.
DrAhmedJava,
72

Opcje kodowania 256 bitów SHA256:

  1. Base64: 6 bitów na znak = CHAR(44)łącznie ze znakiem dopełniania
  2. Hex: 4 bity na znak = CHAR(64)
  3. Binarne: 8 bitów na bajt = BINARY(32)
RickNZ
źródło
30
Base64 ma 3 bajty na 4 znaki, więc mimo że 32 bajty mieszczą się w 43 znakach, tak naprawdę potrzebujesz 44. Dodatkowe = jest dodawane jako znak końcowy
Wilco
2
Cóż, =można go rozebrać i ponownie dodać.
Rick James
28

Wolę używać BINARY (32), ponieważ jest to zoptymalizowany sposób!

Możesz umieścić w nich 32 cyfry szesnastkowe od (00 do FF).

Dlatego BINARY (32)!

marctrem
źródło
8
+1 - Lubię zoptymalizowane ... dla każdego, kto się przy tym dzieje ... aby użyć tego z MySQL ... możesz użyć UPDATE...SET hash_column=UNHEX(sha256HexString). Następnie, podczas odzyskiwania, ty SELECT HEX(hash_column) AS hash_column.
Kevin Nelson
22

Dlaczego miałbyś to zrobić VARCHAR? To się nie zmienia. To zawsze 64 znaki, które można ustalić, uruchamiając cokolwiek w jednym z internetowych kalkulatorów SHA-256 .

ceejayoz
źródło
czy char (64) jest prawidłową instrukcją mysql?
Tony Stark,
28
@hatorade: Nie, to nie jest instrukcja, ale prawidłowy typ kolumny.
Mark Byers
10
varchar również nie przydziela miejsca, chyba że jest używane, w przeciwieństwie do char przydziela liczbę dozwolonych znaków ogółem, niezależnie od tego, czy wypełniają je dane.
Xenland
6

Zostanie naprawione 64 znaki, więc użyj char(64)

Noushad
źródło
I użyj CHARACTER SET ascii.
Rick James