将 SHA256 的输出截断为 128 位

信息安全 哈希 md5 sha256
2021-08-26 09:49:30

假设我们需要/更喜欢 128 位哈希输出,例如生成 128 位加密密钥,或者在其他应用程序(例如文件完整性验证)中消耗更少的存储空间。

我不知道任何新的/标准的/完整的 128 位散列函数,所以看来我们必须使用 SHA256。

将 SHA256 输出截断为 128 位是否可以接受?这种截断的散列是否具有等于 128 位散列的安全性?我的意思是没有已知漏洞的 128 位哈希;绝对不是MD5!

我有一个想法如何做到这一点:

MD5(Truncate128(SHA256_hash))

我不知道这是否会对安全性产生任何好处/损害。

2个回答

尽管 SHA-256 名义上提供 256 位输出,但当输出被截断为 128 位时,它没有任何弱点,当然,除了较短的输出长度所固有的弱点;例如,抗碰撞性从不可行的 2 128下降到可能的(但很难)2 64

这不是散列函数 (*) 的通用属性,但从 SHA-256 的定义方式来看,它有点“明显”。特别是,当 NIST 定义 SHA-224(具有 224 位输出的哈希函数)时,他们仅采用具有不同初始化向量和截断输出的 SHA-256。

(*) 可以证明,给定的安全散列函数在截断时不会非常糟糕,但仍可能比预期的稍差。对于 SHA-256,截断似乎是安全的。

就像 Tom 刚才所说的,为了完整性,您可以将 SHA-256 输出截断为 128 位,因为 128 位足以合理地避免冲突。

但是,像 SHA-256 这样的散列函数不适合密钥生成或文件真实性(仅完整性)。

如果要生成密钥,请使用 PKBDF2 或 scrypt 之类的东西。如果要对文件进行身份验证,请使用 HMAC 函数(可以依赖 SHA-256)。

资料来源:Coursera 上的密码学简介。