我正在开发一个"开放分布式云存储系统"。
我所说的开放是指任何人都可以参与文件的托管。
我目前的设计使用文件内容的sha1哈希作为全局文件id。
假设客户端已经知道这个散列值,并从"带宽供体"接收文件。
客户端现在需要通过生成哈希并将其与预期值进行比较来验证文件是否正确。
然而,我担心的是,有人可能会故意修改文件以生成相同的哈希。据我所知,这对于CRC家族的散列来说是很容易实现的。一些"谷歌搜索"显示,许多人声称MD5也很容易做到这一点。
现在我的问题是:是否有一种哈希算法满足进行的标准
- 快速处理大量数据
- 在哈希范围内分布良好(又称"唯一")
- 具有足够的目标范围("位长度")
- 能够抵御蓄意的碰撞攻击
我能想到的实现满足我需求的设置的所有其他方法都涉及一个秘密组件,例如一个秘密openssl密钥或一个哈希函数的共享秘密salt。
不幸的是,我无法处理这个问题。
您想要的是一个单向函数,它的存在是一个主要的开放问题。
使用加密哈希函数,您想要避免的特定攻击被称为"第二次预映像攻击"。
这应该有助于你在谷歌上搜索你想要的东西,但据我所知,实际上还没有已知的针对MD5的实际第二次预图像攻击。
首先,您可能会发现,很容易找到两个具有相同哈希的任意文件,并且每次尝试时都会找到两个不同的此类对。
但是,很难生成一个文件来伪装成某个特定的文件——换句话说,前面提到的"两个任意文件"中的一个不太可能真正属于存储中的非恶意代理。
如果你仍然不满意,你可能想试试SHA-1、SHA-2或GOST之类的东西。
首先,哈希值永远无法识别文件,因为总是会发生冲突。
话虽如此,你正在寻找的东西被称为加密哈希。这些被设计为不(容易,即除了暴力)允许在保留哈希的同时修改数据,或使用给定的哈希生成新数据。
因此,SHA家族是可以的。
目前,SHA1已经足够了。没有已知的碰撞。
知道你正在哈希的东西的平均大小会有很大帮助。但最有可能的是,如果您的平台主要是64位,那么SHA512是您的最佳选择。您可以截断哈希并只使用其中的256位。如果您的平台主要是32位的,那么SHA256是您的最佳选择。