【问题标题】:Why are hashing algorithms safe to use?为什么哈希算法可以安全使用?
【发布时间】:2016-10-22 02:12:39
【问题描述】:

如今,散列算法被广泛用于检查数据的完整性,但为什么它们可以安全使用? 256 位散列算法生成给定数据的 256 位表示。但是,256 位散列只有 2512 变体。但是 1 KB 的数据有 28192 个不同的变体。世界上的每条数据都有不同的哈希值在数学上是不可能的。那么为什么哈希算法是安全的呢?

【问题讨论】:

  • 这应该迁移到计算机科学家或安全部门
  • @KelvinZhang 单击此页面顶部的 StackExchange 菜单。靠近底部有一个搜索栏,您可以在其中找到其他社区。例如,输入“security”以显示正确的社区。​​span>
  • 您要查找的内容称为“哈希冲突”。这是当 2 个内容具有相同的哈希值时。由于 a/ 哈希算法的构造和 b/ 内容本身的熵,它们非常罕见。
  • 我投票决定将此问题作为题外话结束,因为它与编程无关。它可以在security.stackexchange.com
  • 哈希函数主要有两种类型。 1. 那些允许冲突的地方,例如字典查找函数中使用的那些使用二次方法(如重新散列或完全比较来消除歧义)。 2. 那些抗冲突的,例如密码散列函数,其中输入中的单个位差异将导致大约 50% 的输出位发生变化。 SHA-256 是第二种类型,可以安全地用于确定两个文件是否相同。

标签: algorithm security hash


【解决方案1】:

哈希算法被认为是安全的原因如下:

  1. 它们是不可逆的。您无法通过对输出哈希值进行逆向工程来获取输入数据。
  2. 输入的微小变化将产生截然不同的哈希值。即“hello”与“hellp”会产生完全不同的值。

对数据完整性所做的假设是,在输入数据的良好副本和输入数据的不良(恶意)副本之间,您的大部分输入将是相同的。数据的微小变化会使哈希值完全不同。因此,如果我尝试注入任何恶意代码或数据,那么微小的变化将完全抛弃哈希值。当与已知的哈希值进行比较时,很容易确定数据是否已被修改或损坏。

您是正确的,因为无限数量的数据集之间存在冲突的风险,但是当您比较两个非常相似的数据集时,可以合理地假设这两个几乎等效的数据集的哈希值完全是不同。

【讨论】:

  • 它们的不可逆性是否依赖于数据比散列更长的事实?
  • 在某种程度上是的。由于您将输入值的无限可能性减少为离散数量的输出哈希值,因此输入可能具有无限数量的值,从而使真正的输入无法确定。
  • 我对这个答案不太满意,因为它错过了我认为的问题。他的问题的答案主要是纯粹的统计数据:碰撞概率是多少。根据环境的性质,此答案的备注 2 可能很重要(碰撞分布)。我不认为备注 1 对此有任何补充(正如我所理解的问题;它在加密中很重要)。此外,备注 1 并不总是有效的,因为非加密散列函数通常没有理由对抗反转,因此可能生成 x,因此 f(x)=y(不是重构;但相关)。
  • 这也是一个特殊的约束,使密码哈希函数难以反转。虽然不同的位长度有一些影响,但这个特性是通过特别小心设计算法来实现的(与块密码相比,长度不变,但反转几乎是不可能的)。
  • @Mackers 这只是故事的一部分。压缩算法压缩数据,但结果是可逆的
【解决方案2】:

并非所有哈希都是安全的。有很好的哈希值(对于“好”的某些值),它足以故意制造冲突(我认为 FNV-1a 可能属于这一类)。然而,正确使用的加密散列会在计算上产生冲突。

“好”散列通常具有输入中的小变化导致输出中的大变化的属性(经验法则是输入中的单个位翻转导致输出中大约 b 位翻转,对于 2b 散列)。有一些特殊用途的哈希,其中“关闭输入生成关闭哈希”实际上是一个特性,但您可能不会将它们用于错误检测,但它们可能对其他应用程序有用。

FNV-1a 的一个特定用途是散列大块数据,然后将计算的散列值与其他块的散列值进行比较。只有具有匹配哈希的块需要完全比较以查看它们是否相同,这意味着可以简单地忽略大量块,从而将比较速度提高几个数量级(您可以将一个 2 MB 与另一个比较您可以将其 64 位散列与 256Ki 块的散列进行比较的时间大致相同;尽管您可能会有一些具有冲突散列的块)。

请注意,“只是一个哈希”可能不足以提供安全性,您可能还需要应用某种签名机制来确保您不会遇到有人修改哈希文本的问题以及哈希。

仅仅为了确保存储完整性(基本上“防止意外修改”作为威胁模型),没有签名的加密哈希加上原始大小应该足够好。您将需要一个非常不可能的随机事件序列,将一个固定长度的位字符串变异为另一个相同长度的固定长度位字符串,并给出相同的哈希值。当然,这并没有给你任何纠错能力,只是错误检测。

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 2012-01-25
    • 2011-03-27
    • 2015-10-19
    • 2019-07-17
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多