在MySQL中存储SHA1哈希值

nik*_*sfi 155 mysql hash database-design sha1

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

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

Gum*_*mbo 307

我将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
);
Run Code Online (Sandbox Code Playgroud)

百万条记录binary(20)需要44.56M,而char(40)需要64.57M. InnoDB发动机.

  • @Gumbo:先生,我相信,你以前做过这件事!:) (10认同)
  • 在PostgreSQL中,这将转换为使用bytea字段,对吧? (2认同)
  • phpmyadmin用户请注意.将哈希存储为二进制时,phpmyadmin会将其显示为十六进制字符串,但pma将无法在提供的"搜索选项卡"中使用它.仅当您手动将`UNHEX()`添加到sql时才会起作用. (2认同)
  • @Gumbo您可以在bytea中存储可变数量的字节.您指的是bytea类型的存储要求.这是"1或4个字节加上实际的二进制字符串"."1或4"所指的可能是存储数据的长度,因为您不能像使用varchar那样使用零字节来结束字符串.这意味着,但在手册中没有说明,您可以在bytea中存储多达2 ^(8*4)或4+千兆字节.http://www.postgresql.org/docs/9.0/static/datatype-binary.html在postgres数据库中存储哈希可能是最小的_bit_或bytea列. (2认同)
  • http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_sha1提供存储crypt函数结果时的性能和存储信息 (2认同)

sch*_*ick 43

SHA1哈希是40个字符长!


Anv*_*esh 11

从这篇博客中摘录:

下面是散列算法列表及其需求位大小:

  • MD5 = 128位哈希值.
  • SHA1 = 160位哈希值.
  • SHA224 = 224位哈希值.
  • SHA256 = 256位哈希值.
  • SHA3​​84 = 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)
);
Run Code Online (Sandbox Code Playgroud)

  • 请_please_,_**请**_实际上不存储这样的密码. (9认同)
  • 存储简单的密码哈希值使得如果您的数据库遭到破坏,密码被"提取"比使用盐渍(希望被拉伸)的密码哈希更容易.推荐阅读:https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016 (4认同)
  • @BerryM。一年后读到这篇文章,并没有想到有人在谈论密码,或者人们是否仍然使用简单的哈希来存储身份验证数据。但他们确实:D (2认同)

ina*_*ruk 6

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