【问题标题】:Is there an especially unlikely SHA1 hash?是否存在特别不可能的 SHA1 哈希?
【发布时间】:2014-05-01 04:23:23
【问题描述】:

我有一个Map<SHA1, BinaryBlob>。与 Git 非常相似。

我想在这张地图中放入少量有限数量的“特殊”条目。我希望能够更改二进制 blob 的值,但仍通过相同的键引用它们。

正确的做法是使用Map<Either<SHA1, SpecialKey>, BinaryBlob>

执行此操作的 hack 方式(这是我实际执行此操作的方式)是定义:

SHA1 specialKeyA = 0x00000 ... 00
SHA1 specialKeyB = 0x00000 ... 01

我了解 SHA1 产生的值是均匀分布的。但我想知道是否可能有一个星号,以及是否有几个极端情况哈希(例如0x00..0xFF...)保证不会发生。

我对我目前的设计感觉很安全,但我只是好奇:)

编辑:我已经指望哈希唯一性了,所以我觉得这个设计非常安全。出于好奇,问题是:是否有一些 SHA1 碰巧无法生成的值。到目前为止,cmets 中的人口普查似乎没有......

【问题讨论】:

  • 可以肯定,任何此类偏见都会是一个缺陷,会使逆转变得更加容易/可能。
  • 鉴于您的“魔术哈希值”在天文上不太可能与任何东西发生冲突,我会说“去吧”。它仍然是一个黑客。但在这一点上,我们不要过度设计。
  • 您的问题的答案是也许。 SHA1 产生 20 字节的输出;由于鸽巢原理,这些输出中的每一个都将在 0 到 264 - 1 的输入范围内产生。如果您可以将“hack”存储为任何其他 然后是 20 字节,然后这样做;那么你就完成了。
  • @ElliottFrisch 也许应该补充一点,所有 SHA1 哈希的可能性都相同(不)。因此,在给定的上下文中,虽然问题的答案可能是“否”,但建议的方法仍然相当安全。
  • @Sigi 我修改了我的评论。如果您存储的魔法散列值不是 20 字节长度,则它不能是有效的 SHA1 散列。因此,对于 SHA1,21 字节的散列尤其是不太可能。

标签: git sha1 sha


【解决方案1】:

据我所知,SHA1 没有已知的00…00 原像(也没有00…0100…02 或其他“特殊”值)。尽管它不会违反任何安全哈希的正式定义,但 IV 旨在避免这种人类可识别的模式。

我仍然可能建议不要使用这些值,因为其他人可能也想出了使用这些特殊值的想法,例如,请参阅this question about a git commit with all zeros。如果对你来说都一样,我会生成一个随机的 80 位值,例如83a…c3,并将你的计数器附加到它上面,例如83a…c300…0183a…c300…02 等。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2011-10-27
    • 2021-11-23
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多