Сохранение хэш-значений SHA1 в MySQL

У меня есть простой вопрос, который возник, когда я хотел сохранить результат хэш SHA1 в базе данных MySQL:

Как долго должно быть поле VARCHAR, в котором я сохраняю хэш-результат?

Ответ 1

Я использовал бы 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.56M, а CHAR(40) - 64.57M. InnoDB двигатель.

Ответ 2

Хэш SHA1 имеет длину 40 символов!

Ответ 3

Ссылка, взятая из этого блога:

Ниже приведен список алгоритмов хэширования и его размер бит:

  • 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')
    ,SHA1('SamplePass')
    ,SHA2('SamplePass',224)
    ,SHA2('SamplePass',256)
    ,SHA2('SamplePass',384)
    ,SHA2('SamplePass',512)
);

Ответ 4

Размер вывода sha1 составляет 160 бит. Который составляет 160/8 == 20 символов (если вы используете 8-битные символы) или 160/16 = 10 (если вы используете 16-битные символы).

Ответ 5

Таким образом, длина находится между 10 16-битными символами и 40 шестнадцатеричными цифрами.

В любом случае решите формат, который вы собираетесь хранить, и сделайте поле фиксированным размером на основе этого формата. Таким образом, у вас не будет никакого потерянного пространства.

Ответ 6

Вы все равно можете использовать VARCHAR в случаях, когда вы не всегда сохраняете хэш для пользователя (т.е. аутентифицировать учетные записи/забытый URL-адрес для входа). Как только пользователь аутентифицировал/изменил свою регистрационную информацию, он не сможет использовать хэш и не должен иметь никаких причин. Вы можете создать отдельную таблицу для хранения временных хэш файлов > ассоциаций пользователей, которые могут быть удалены, но я не думаю, что большинство людей этого не делают.

Ответ 7

Если вам нужен индекс в столбце sha1, я предлагаю CHAR (40) по соображениям производительности. В моем случае столбцом sha1 является токен подтверждения электронной почты, поэтому на целевой странице запрос вводится только с токеном. В этом случае CHAR (40) с INDEX, на мой взгляд, лучший выбор:)

Если вы хотите принять этот метод, не забудьте оставить $raw_output = false.