我想知道截断 SHA1 并仅比较前 10/12 个字节等有多糟糕。我正在使用固定长度的 8 个字节,我需要对其进行散列以实现唯一性,但以最小的字节存储可能的足迹(8个其他字节会很好,但我想不可行)。
在不牺牲专业秘密的情况下获得更多信息:
- 一些黑盒获取一个 8 字节的值,对其进行转换并将其传输到服务器,在那里根据已知项目表检查其有效性。
- 黑盒和服务器都不应该知道原来的 8 个字节。
最好的解决方案是某种 1 对 1 的单向关系,例如非对称加密。但我认为任何加密机制都不会输出这么少的字节。
我想知道截断 SHA1 并仅比较前 10/12 个字节等有多糟糕。我正在使用固定长度的 8 个字节,我需要对其进行散列以实现唯一性,但以最小的字节存储可能的足迹(8个其他字节会很好,但我想不可行)。
在不牺牲专业秘密的情况下获得更多信息:
最好的解决方案是某种 1 对 1 的单向关系,例如非对称加密。但我认为任何加密机制都不会输出这么少的字节。
没有绝对的答案,因为它取决于攻击模型。通过截断散列,可以使一些操作更容易;如果攻击者想要执行这些操作,这很糟糕,并且使它们更容易实际上使它们变得可行。
加密哈希函数试图满足三个主要特征:
对于具有n位输出的完美散列函数,寻找原像、第二原像或碰撞的成本将分别为 2 n、 2 n和 2 n /2。通过截断哈希输出,您相应地降低了这些成本。根据经验,2 64的成本非常困难(可行,但需要十几台 PC),而 2 80是不可行的。
在您的情况下,如果攻击者对冲突感兴趣,并且他可以选择散列的内容,那么攻击者将尝试输入两个暗示散列冲突的数据元素(在您的截断散列上)。截断到 12 个字节使攻击变得非常可行,如果减少到 8 个字节就很容易。另一方面,如果攻击者所能做的就是试图找到一些与给定截断散列(第二个原像)匹配的数据元素,那么在 10 或 12 字节上这仍然太难实现,而在 8 字节上它是只是“非常昂贵”(因此可能不值得付出努力)。
如果没有攻击者,而你只是在与厄运作斗争,那么截断为 8 个字节会带来虚假冲突的风险;在(平均)输入数十亿个条目后,您应该会遇到第一次碰撞。根据您的情况,这可能会或可能不会被容忍。
关于一般的截断,它不一定是坏的。事实上,SHA-384 算法被定义为执行(稍作修改)SHA-512,然后将结果截断为 384 位。我想通过提供有关 SHA 标准截断的相关材料来添加现有答案。
SHA 标准FIPS 180-4明确允许截断最左边的位。
某些应用程序可能需要一个消息摘要长度不同于本标准中散列函数提供的散列函数。在这种情况下,可以使用截断的消息摘要,从而将具有较大消息摘要长度的散列函数应用于要散列的数据,并通过选择适当数量的最左边位来截断得到的消息摘要。有关选择截断消息摘要长度的指南以及有关其对使用它的加密应用程序的安全影响的信息,请参阅 SP 800-107 [SP 800-107]。
SP 800-107阐明了截断规则:
让(缩短的)消息摘要称为截断消息摘要,并令 λ 为其所需的比特长度。如果满足以下要求,则可以使用截断的消息摘要:
要使用的经批准的散列函数的输出块的长度应大于λ(即,L > λ)。
应选择全长消息摘要的最左边的 λ 个比特作为截断消息摘要。
例如,如果需要截断的 96 位消息摘要,则可以使用 SHA-256 散列函数(例如,因为它对应用程序可用,并提供大于 96 位的输出)。SHA-256 生成的 256 位消息摘要的最左边 96 位被选为截断消息摘要,消息摘要最右边的 160 位被丢弃。
如果需要抗碰撞性,λ 应至少是截断消息摘要所需的抗碰撞强度 s(以比特为单位)的两倍(即 λ ≥ 2s)。
它以关于截断哈希的安全性的警告结束了截断部分。
截断消息摘要会影响应用程序的安全性。通过截断消息摘要,预期的抗碰撞强度从 L/2 降低到 λ/2(以位为单位)。对于上面第 2 项中的示例,即使 SHA-256 提供 128 位的抗碰撞性,96 位截断消息摘要提供的抗碰撞性是截断消息摘要长度的一半,即 48 位,在这种情况下.