Хранение хэш-значений SHA1 в MySQL
-
03-07-2019 - |
Вопрос
У меня возник простой вопрос, когда я хотел сохранить результат хэша SHA1 в базе данных MySQL:
Как долго следует ВАРЧАР поле, в котором я сохраняю результат хеша?
Решение
Я бы использовал 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
.
Другие советы
SHA1-хэш имеет длину 40 символов!
Ниже приведен список алгоритмов хеширования с указанием требуемого размера в битах:
- MD5 = 128-битное хэш-значение.
- SHA1 = 160-битное хэш-значение.
- SHA224 = 224-битное хеш-значение.
- SHA256 = 256-битное хеш-значение.
- SHA384 = 384-битное хеш-значение.
- SHA512 = 512-битное хэш-значение.
Создал один образец таблицы с требованием 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) с INDEX, на мой взгляд, является лучшим выбором:)
Если вы хотите применить этот метод, не забудьте оставить $ raw_output = false.