Хранение хэш-значений SHA1 в MySQL
У меня есть простой вопрос, который возник, когда я хотел сохранить результат хэша SHA1 в базе данных MySQL:
сколько стоит тип varchar поле, в котором я храню результат хэша?
7 ответов:
я хотел бы использовать
VARCHAR
для данных переменной длины, но не для данных фиксированной длины. Потому что значение SHA-1 всегда 160 бит, тоVARCHAR
будет просто отходы дополнительный байт для длины поля фиксированной длины.и я также не буду хранить значение
SHA1
возвращается. Потому что он использует только 4 бит на символ и, таким образом, потребуется 160/4 = 40 символов. Но если вы используете 8 бит на символ, вы бы только нужно поле длиной 160/8 = 20 символов.поэтому я рекомендую вам использовать
BINARY(20)
иUNHEX
функции преобразованиеSHA1
значение в двоичном формате.я сравнил требования к хранению для
BINARY(20)
иCHAR(40)
.CREATE TABLE `binary` ( `id` int unsigned auto_increment primary key, `password` binary(20) not null ); CREATE TABLE `char` ( `id` int unsigned auto_increment primary key, `password` char(40) not null );
С миллионом записей
binary(20)
занимает 44.56 м, в то время какchar(40)
занимает 64.57 М.InnoDB
двигатель.
Ниже приведен список алгоритмов хэширования вместе с его требуемым размером бита:
- MD5 = 128-битное значение хэша.
- SHA1 = 160-битное значение хэша.
- SHA224 = 224-битное хэш-значение.
- SHA256 = 256-битное значение хэша.
- SHA384 = 384-битное хэш-значение.
- SHA512 = 512-битный хэш значение.
создал один образец таблицы с require CHAR (n):
CREATE TABLE tbl_PasswordDataType ( ID INTEGER ,MD5_128_bit CHAR(32) ,SHA_160_bit CHAR(40) ,SHA_224_bit CHAR(56) ,SHA_256_bit CHAR(64) ,SHA_384_bit CHAR(96) ,SHA_512_bit CHAR(128) ); INSERT INTO tbl_PasswordDataType VALUES ( 1 ,MD5('SamplePass_WithAddedSalt') ,SHA1('SamplePass_WithAddedSalt') ,SHA2('SamplePass_WithAddedSalt',224) ,SHA2('SamplePass_WithAddedSalt',256) ,SHA2('SamplePass_WithAddedSalt',384) ,SHA2('SamplePass_WithAddedSalt',512) );
выходной размер sha1 составляет 160 бит. Это 160/8 = = 20 символов (если вы используете 8-битные символы) или 160/16 = 10 (если вы используете 16-битные символы).
таким образом, длина находится между 10 16-битными символами и 40 шестнадцатеричными цифрами.
в любом случае решите формат, который вы собираетесь хранить, и сделайте поле фиксированного размера на основе этого формата. Таким образом, у вас не будет пустого места.
вы все еще можете использовать VARCHAR в тех случаях, когда вы не всегда храните хэш для пользователя (т. е. аутентификация учетных записей/забыли url-адрес входа). После того, как пользователь аутентифицировал/изменил свою регистрационную информацию, они не должны иметь возможности использовать хэш и не должны иметь никаких оснований. Вы можете создать отдельную таблицу для хранения временных хэш - > ассоциаций пользователей, которые могут быть удалены, но я не думаю, что большинство людей беспокоятся об этом.
Если вам нужен индекс в столбце sha1, я предлагаю CHAR(40) по соображениям производительности. В моем случае столбец sha1 является маркером подтверждения электронной почты, поэтому на целевой странице запрос вводится только с помощью маркера. В этом случае CHAR (40) с индексом, на мой взгляд, является лучшим выбором:)
Если вы хотите принять этот метод, не забудьте оставить $raw_output = false.