Как долго хэш SHA256?

248

Я собираюсь запустить SHA256пароль + соль, но я не знаю, как долго это сделать VARCHARпри настройке базы данных MySQL. Что такое хорошая длина?

Тони Старк
источник
9
Прежде чем кто-либо прочтет это, решит последовать этому совету и использовать его SHA-*для хэширования паролей, ПОЖАЛУЙСТА, сначала прочтите это .
c00000fd
2
Если вы не используете SHA-256 для паролей, чего не следует делать, хеш-коды имеют длину 256 бит, или 64 шестнадцатеричных символа, или 43 буквенно-цифровых символа, или 32 байта.
каркать

Ответы:

337

Sha256 имеет длину 256 бит - как видно из его названия.

Поскольку sha256 возвращает шестнадцатеричное представление, для кодирования каждого символа достаточно 4 бит (вместо 8, как для ASCII), поэтому 256 бит будут представлять 64 шестнадцатеричных символа, поэтому вам нужна буква a varchar(64)или даже a char(64), поскольку длина всегда одинакова , не меняясь вообще.

И демо:

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

Дам тебе :

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

т.е. строка из 64 символов.

Паскаль МАРТИН
источник
7
Можем ли мы использовать char (64) в качестве первичного ключа или двоичный (32) будет лучше для этого? (access_token)
французски
3
Если вы думаете, что можете заблокировать пользователя в будущем, тогда я предлагаю использовать varchar(65)в качестве ведущего !... просто сказать.
Манатакс
105
... или просто добавить столбец "заблокирован"?
Стейн де Витт
5
Поскольку вы хотите иметь различную соль для каждого пароля, вы должны хранить это рядом с хешем. Для этого вы можете использовать дополнительное поле или предварительно / добавить его в хеш, так что вам понадобится более 64 символов
Патрик Корнелиссен,
4
Вы можете использовать этот оператор select для проверки: SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))всегда равно 44 независимо от длины исходной строки.
DrAhmedJava
72

Варианты кодирования для 256-битного SHA256:

  1. Base64: 6 бит на символ = CHAR(44)включая символ заполнения
  2. Hex: 4 бита на символ = CHAR(64)
  3. Двоичный код: 8 бит на байт = BINARY(32)
RickNZ
источник
30
Base64 составляет 3 байта на 4 символа, поэтому, несмотря на то, что 32 байта умещаются в 43 символа, вам действительно нужно 44. В качестве последнего символа добавляется дополнительный =
Wilco
2
Ну, =можно удалить и снова добавить.
Рик Джеймс
28

Я предпочитаю использовать BINARY (32), так как это оптимизированный способ!

Вы можете поместить в эти 32 шестнадцатеричные цифры от (00 до FF).

Поэтому БИНАРНЫЙ (32)!

marctrem
источник
8
+1 - мне нравится оптимизировано ... всем, кто сталкивается с этим ... использовать это с MySQL ... вы можете использовать UPDATE...SET hash_column=UNHEX(sha256HexString). Затем, когда вы получите его, вы SELECT HEX(hash_column) AS hash_column.
Кевин Нельсон
22

Зачем ты сделал это VARCHAR? Это не меняется. Это всегда 64 символа, что можно определить, запустив что-нибудь в один из онлайн-калькуляторов SHA-256 .

ceejayoz
источник
является ли char (64) допустимым оператором mysql?
Тони Старк
28
@hatorade: Нет, это не утверждение, а допустимый тип столбца.
Марк Байерс
10
varchar также не выделяет место, если только он не используется, в отличие от char, он выделяет количество разрешенных символов, независимо от того, есть ли данные, заполняющие его.
Xenland
6

Будет исправлено 64 символа, поэтому используйте char(64)

Noushad
источник
И использовать CHARACTER SET ascii.
Рик Джеймс