我正在开发一个“开放式分布式云存储系统”。
开放我的意思是任何人都可以参与托管文件。
我当前的设计使用文件内容的sha1哈希作为全局文件ID。
假设客户端已经知道此哈希值并从“带宽捐赠者”接收文件。
客户端现在需要通过生成散列并将其与预期值进行比较来验证文件确实是正确的。
然而,我担心的是有人可能故意修改文件以产生相同的哈希值。据我所知,这对CRC系列的哈希很容易实现。一些“谷歌搜索”揭示了很多声称,MD5也很容易。
现在我的问题是:是否有一个满足标准的散列算法
我能想到实现满足我需求的设置的所有其他方法涉及一个秘密组件,例如秘密openssl密钥或哈希函数的共享秘密盐。
不幸的是我无法解决这个问题。
答案 0 :(得分:2)
首先,哈希值永远无法识别文件,因为总会有冲突。
话说回来,你要找的是cryptographic hash。这些设计的目的不是(容易地,即强力除外)允许在保持散列的同时修改数据,或者使用给定的散列生成新数据。
因此,SHA系列没问题。
答案 1 :(得分:2)
目前,SHA1已足够。没有碰撞。
了解你正在散列的东西的平均大小会有很大帮助。但最有可能的是,如果您的平台主要是64位,SHA512是您的最佳选择。您可以截断哈希并仅使用256位。如果您的平台主要是32位,SHA256是您的最佳选择。
答案 2 :(得分:2)
你要求的是单向函数,它的存在是一个主要的开放问题。
使用加密哈希函数,您想要避免的特定攻击称为“第二次前映像攻击”。
这应该可以帮助你搜索你想要的东西,但据我所知,实际上没有已知的MD5实用的第二次前映像攻击。
首先,您可能发现很容易找到两个具有相同哈希值的任意文件,并且每次尝试时都会找到两个不同的对。
但很难生成一个伪装成某个特定文件的文件 - 换句话说,前面提到的“两个任意文件”中的一个实际上不太可能属于您存储中的非恶意代理。
如果您仍然不满意,可能需要尝试使用SHA-1或SHA-2或GOST。