我的意思是,这仅仅是“用当前技术反转功能有多困难”的问题吗?
或者是否存在使它们不同的数学概念或属性?
如果是“逆函数有多难”的问题,那么说随着技术的进步,一些 Cryptographic Hash Functions 不再是 Cryptographic 成为仅仅是 Hash Functions 是否正确?这是MD5发生的事情吗?
我的意思是,这仅仅是“用当前技术反转功能有多困难”的问题吗?
或者是否存在使它们不同的数学概念或属性?
如果是“逆函数有多难”的问题,那么说随着技术的进步,一些 Cryptographic Hash Functions 不再是 Cryptographic 成为仅仅是 Hash Functions 是否正确?这是MD5发生的事情吗?
每个密码散列函数都是一个散列函数。但并非每个散列函数都是加密散列。
加密哈希函数旨在保证许多安全属性。最重要的是,很难找到碰撞或原像,并且输出看起来是随机的。(还有更多属性,并且“硬”在这种情况下具有明确定义的界限,但这在这里并不重要。)
非加密哈希函数只是试图避免非恶意输入的冲突。一些旨在检测数据中的意外更改 (CRC),另一些则尝试将对象放入哈希表中的不同存储桶中,并尽可能减少冲突。
为了换取较弱的保证,它们通常(很多)更快。
我仍然将 MD5 称为加密哈希函数,因为它旨在提供安全性。但它已损坏,因此不再可用作加密哈希。另一方面,当您有一个非加密哈希函数时,您不能真正称其为“损坏”,因为它从一开始就从未尝试过安全。
有一些加密安全散列函数强烈需要的属性,而非加密安全散列函数不需要那么强烈:
h
,一定很难找到散列时m
产生的消息h
m1
,必须很难找到不同的消息,m2
从而产生相同的哈希)m1
m2
m1
消息)m2
在这些方面,您会看到很多困难,这是一种定性测量而不是定量测量。这里最好的答案是可行性:当某件事变得可行并且这些线随着时间推移而移动时,会有一条模糊线(随着计算能力根据摩尔定律呈指数增长,一旦困难的问题现在可以通过您的手机解决)。
一般来说,假设困难意味着实现某个目标的时间是 NP 完全的,这是一种很好的做法。这意味着随着散列长度的增加,破坏散列所需的时间会大幅增加。
另一点是,加密安全的散列算法在某些应用程序中可能有用,但在其他应用程序中则不然。这取决于攻击者的模型、您要保护的信息的性质以及性能要求等因素(一般来说,哈希的加密属性越好,它的运行时行为就越差)。
我想说这里要理解的两个关键是:
术语“加密散列函数”通常用于指代可能更好地标记为抗冲突散列函数,它们是需要具有这三个属性的公共函数(“公共”=不需要密钥) :
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 等旧哈希函数无法满足随机预言属性的最明显原因。)