在MySQL中存储SHA1哈希值

时间:2009-03-05 11:57:17

标签: mysql database-design hash sha1

当我想在SHA数据库中存储SHA1哈希的结果时,我遇到了一个简单的问题:

VARCHAR 字段应该在多长时间内存储哈希的结果?

7 个答案:

答案 0 :(得分:303)

我会将VARCHAR用于可变长度数据,但不使用固定长度数据。由于SHA-1值总是 160位长,VARCHAR只会浪费an additional byte for the length of the fixed-length field

而且我也不会存储SHA1返回的值。因为它每个字符仅使用4位,因此需要160/4 = 40个字符。但是如果你每个字符使用8位,那么你只需要一个160/8 = 20个字符的长字段。

因此,我建议您使用BINARY(20)UNHEX functionSHA1值转换为二进制值。

我比较了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引擎。

答案 1 :(得分:40)

SHA1哈希长度为40个字符!

答案 2 :(得分:11)

<强> Reference taken from this blog:

下面是哈希算法及其需要位大小的列表:

  • 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)
);

答案 3 :(得分:6)

sha1的输出大小为160位。这是160/8 == 20个字符(如果你使用8位字符)或160/16 = 10(如果你使用16位字符)。

答案 4 :(得分:3)

因此长度介于10个16位字符和40个十六进制数字之间。

在任何情况下,决定您要存储的格式,并根据该格式将字段设置为固定大小。 这样你就不会浪费任何空间。

答案 5 :(得分:2)

如果您不总是为用户存储哈希值(即验证帐户/忘记登录URL),您可能仍希望使用VARCHAR。一旦用户验证/更改了他们的登录信息,他们就不应该使用哈希并且没有理由。您可以创建一个单独的表来存储临时哈希 - &gt;可以删除的用户关联,但我认为大多数人都不愿意这样做。

答案 6 :(得分:2)

如果你需要sha1列的索引,我建议CHAR(40)出于性能原因。 在我的情况下,sha1列是电子邮件确认令牌,因此在登录页面上,查询仅使用令牌输入。 在这种情况下,我认为带有INDEX的CHAR(40)是最佳选择:)

如果您想采用此方法,请记住留下$ raw_output = false。