为什么哈希算法可以安全使用?

时间:2016-06-20 18:04:31

标签: algorithm security hash

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

2 个答案:

答案 0 :(得分:6)

哈希算法被认为是安全的原因是由于以下原因:

  1. 他们是不可逆转的。您无法通过反向设计输出哈希值来获取输入数据。
  2. 输入中的微小变化将产生大不相同的哈希值。即“hello”vs“hellp”将产生完全不同的值。
  3. 数据完整性的假设是,输入数据的良好副本和输入数据的恶意(恶意)副本之间的大部分输入都是相同的。数据的微小变化将使哈希值完全不同。因此,如果我尝试注入任何恶意代码或数据,那么小的更改将完全抛弃哈希的值。当使用已知的哈希值进行比较时,如果数据已被修改或损坏,则可以轻松确定。

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

答案 1 :(得分:1)

并非所有哈希都是安全的。有好的哈希值(对于某些值"好的"),其中故意产生碰撞是非常重要的(我认为FNV-1a可能属于这一类)。但是,正确使用的加密哈希在生成冲突时计算成本很高。

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

FNV-1a的一个特定用途是散列大块数据,然后将计算出的散列与其他块的散列进行比较。只需要对具有匹配哈希的块进行全面比较,看它们是否相同,这意味着可以简单地忽略大量块,从而加快比较数量级(可以比较一个2 MB到另一个在大约相同的时间,你可以将其64位散列与256Ki块的散列进行比较;虽然你将探讨有几个具有碰撞散列的块)。

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

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