1

我正在开发一个“开放的分布式云存储系统”。

开放是指任何人都可以参与文件托管。

我当前的设计使用文件内容的 sha1 哈希作为全局文件 ID。

假设客户端已经知道这个哈希值并从“带宽捐助者”接收文件。

客户端现在需要通过生成哈希并将其与预期值进行比较来验证文件确实是正确的。

但是我担心有人可能会故意修改文件以产生相同的哈希值。据我所知,这对于 CRC 系列的散列很容易实现。周围的一些“谷歌搜索”揭示了许多声称对于 MD5 来说同样容易的说法。

现在我的问题是:是否有满足beeing标准的散列算法

  • 快速处理大量数据
  • 在散列范围内分布良好(又名“唯一”)
  • 有足够的目标范围(“位长”)
  • 可以抵抗故意的碰撞攻击

我能想到实现满足我需要的设置的所有其他方式都涉及秘密组件,例如秘密 openssl 密钥或散列函数的共享秘密盐。

不幸的是,我无法使用它。

4

3 回答 3

2

首先,哈希值永远无法识别文件,因为总会有冲突。

话虽如此,您正在寻找的东西称为加密哈希。这些被设计为不允许(很容易,即除了蛮力之外)在保留散列的同时修改数据,或使用给定的散列生成新数据。

因此,SHA 家族是可以的。

于 2012-09-27T17:48:22.880 回答
2

目前,SHA1 就足够了。没有已知的碰撞。

了解您正在散列的事物的平均大小会很有帮助。但最有可能的是,如果您的平台主要是 64 位,那么 SHA512 是您的最佳选择。您可以截断散列并仅使用其中的 256 位。如果您的平台主要是 32 位,那么 SHA256 是您的最佳选择。

于 2012-09-27T17:48:24.540 回答
2

你所要求的是一个单向函数,它的存在是一个主要的开放问题。

使用加密哈希函数,您想要避免的特定攻击称为“第二次原像攻击”。

这应该可以帮助您在谷歌上搜索您想要的东西,但据我所知,实际上没有已知的实用的 MD5 二次原像攻击。

首先,您可能发现很容易找到两个具有相同哈希的任意文件,并且每次尝试都可以找到两个不同的此类对。

但是很难生成一个文件来伪装成某个特定文件——换句话说,前面提到的“两个任意文件”中的一个实际上不太可能属于您存储中的非恶意代理。

如果您仍然不满意,您可能想尝试 SHA-1 或 SHA-2 或 GOST。

于 2012-09-27T18:11:33.220 回答