Скільки часу хеш SHA256?


247

Я буду запускати SHA256пароль + сіль, але я не знаю, як довго заробляти VARCHARпід час налаштування бази даних MySQL. Що таке хороша довжина?


9
Перш ніж хтось, хто читає це, вирішив дотримуватися цієї поради та використати SHA-*хеш-паролі, ПРОСУЖДАЙТЕ це спочатку прочитати .
c00000fd

2
Якщо ви не використовуєте SHA-256 для паролів, чого ви не повинні робити, хеші мають довжину 256 біт, або 64 шістнадцяткових символів, або 43 буквено-цифрових символів або 32 байти.
каркати

Відповіді:


335

Sha256 - це 256 біт, як вказує його назва.

Оскільки sha256 повертає шістнадцяткове представлення, для кодування кожного символу достатньо 4 бітів (замість 8, як для ASCII), тож 256 бітів представлятимуть 64 шістнадцяткових символів, тому вам потрібен а 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)для ведучого !... просто кажу.
Манатакс

103
... або просто додати стовпець "заблокований"?
Штійн де Вітт

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 = CHAR(44)включаючи символи прокладки
  2. Шестнадцятковий: 4 біта на char = CHAR(64)
  3. Двійковий: 8 біт на байт = BINARY(32)

30
Base64 - 3 байти на 4 символи, тому, хоча 32 байти вміщуються в 43 символи, вам фактично потрібно 44. Додатковий = додається як кінцевий символ
Wilco

2
Ну, =баночку можна зняти і знову додати.
Рік Джеймс

28

Я вважаю за краще використовувати BINARY (32), оскільки це оптимізований спосіб!

Ви можете розмістити в цих 32 шістнадцяткових цифрах від (00 до FF).

Тому БІНАР (32)!


8
+1 - Мені подобається оптимізовано ... для всіх, хто трапляється на цьому ... використовувати це з MySQL ... ви можете використовувати UPDATE...SET hash_column=UNHEX(sha256HexString). Потім, отримуючи його, ви SELECT HEX(hash_column) AS hash_column.
Кевін Нельсон

22

Навіщо зробити це ВАРЧАР? Він не змінюється. Це завжди 64 символи, які можна визначити, запустивши що-небудь в один з онлайн-калькуляторів SHA-256 .


чи char (64) є дійсним твердженням mysql?
Тоні Старк

28
@hatorade: Ні, це не твердження, але це допустимий тип стовпця.
Марк Байєрс

10
varchar також не виділяє простір, якщо не використовується, на відміну від char він виділяє кількість загальних символів, дозволених незалежно від наявності даних, що заповнюють його.
Xenland

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.