哈希函数和加密哈希函数有什么区别?

信息安全 密码学 哈希
2021-09-03 06:47:31

我的意思是,这仅仅是“用当前技术反转功能有多困难”的问题吗?

或者是否存在使它们不同的数学概念或属性?

如果是“逆函数有多难”的问题,那么说随着技术的进步,一些 Cryptographic Hash Functions 不再是 Cryptographic 成为仅仅是 Hash Functions 是否正确?这是MD5发生的事情吗?

3个回答

每个密码散列函数都是一个散列函数。但并非每个散列函数都是加密散列。

加密哈希函数旨在保证许多安全属性。最重要的是,很难找到碰撞或原像,并且输出看起来是随机的。(还有更多属性,并且“硬”在这种情况下具有明确定义的界限,但这在这里并不重要。)

非加密哈希函数只是试图避免非恶意输入的冲突。一些旨在检测数据中的意外更改 (CRC),另一些则尝试将对象放入哈希表中的不同存储桶中,并尽可能减少冲突。

为了换取较弱的保证,它们通常(很多)更快。

我仍然将 MD5 称为加密哈希函数,因为它旨在提供安全性。但它已损坏,因此不再可用作加密哈希。另一方面,当您有一个非加密哈希函数时,您不能真正称其为“损坏”,因为它从一开始就从未尝试过安全。

有一些加密安全散列函数强烈需要的属性,而非加密安全散列函数不需要那么强烈:

  • 原像抗性(给定散列h,一定很难找到散列时m产生的消息h
  • 抗碰撞能力弱(给定一条消息m1,必须很难找到不同的消息m2从而产生相同的哈希)m1m2
  • 强大的抗碰撞性(应该很难找到任何产生相同哈希的m1消息)m2

在这些方面,您会看到很多困难,这是一种定性测量而不是定量测量。这里最好的答案是可行性:当某件事变得可行并且这些线随着时间推移而移动时,会有一条模糊线(随着计算能力根据摩尔定律呈指数增长,一旦困难的问题现在可以通过您的手机解决)。

一般来说,假设困难意味着实现某个目标的时间是 NP 完全的,这是一种很好的做法。这意味着随着散列长度的增加,破坏散列所需的时间会大幅增加。

另一点是,加密安全的散列算法在某些应用程序中可能有用,但在其他应用程序中则不然。这取决于攻击者的模型、您要保护的信息的性质以及性能要求等因素(一般来说,哈希的加密属性越好,它的运行时行为就越差)。

我想说这里要理解的两个关键是:

  1. 术语“散列函数”是模糊的——或者更准确地说,是多义的:它具有密切相关但不同的含义的“家族”。如果有人将函数标记为“散列函数”,则该标签根本不会告诉您该函数必须具有哪些属性。您必须检查使用该术语的上下文以及该上下文的要求。
  2. 术语“加密散列函数”有点用词不当——它看起来像一个描述,但它有一个术语本身实际上并没有描述的涉及的技术定义。简而言之,像消息认证码 (MAC)这样的函数通常被标记为散列函数并提供某种形式的加密安全性,但不是传统定义中的“加密散列函数”。

术语“加密散列函数”通常用于指代可能更好地标记为抗冲突散列函数,它们是需要具有这三个属性的公共函数(“公共”=不需要密钥) :

  • 第二原像抗性:m1对于诚实方选择的随机值,攻击者要找到任何m2 ≠ m1这样的值都是非常昂贵的hash(m1) = hash(m2)
  • 原像抵抗:h对于诚实方选择的随机值,攻击者要找到任何m这样的值都是非常昂贵的hash(m) = h
  • 碰撞阻力:对于攻击者来说,找到任何一对m1 ≠ m2这样的值是非常昂贵的hash(m1) = hash(m2)

还有第四个属性,旧的加密散列函数很容易失败,但是像 SHA-3 和 Blake2 这样的较新的函数旨在实现:

  • 随机预言不可区分性:这个几乎不可能简单解释,但让我们把它简化为:攻击者要找到他们选择的输入输出之间的任何非机会相关性是非常昂贵的。

随机预言属性(如果公式正确)暗示了前面的三个属性,以及其他属性,例如没有有效的长度扩展攻击(长度扩展是 SHA-256 和 SHA-512 等旧哈希函数无法满足随机预言属性的最明显原因。)