自引用MD5文件

时间:2010-08-30 12:44:43

标签: java security md5

我正在开发一个需要在外部文件中加载和保存数据的程序,我一直在搜索选项,我选择将数据保存在二进制文件中。

由于我不希望有人能够轻松编辑文件,我想到了在文件的第一行写入,它的md5总和。在这种情况下,如果文件的某些数据发生更改,则总和将与第一行的数据不匹配。

我发现的问题是,如果我计算MD5,之后我在文件中写入信息,很明显总和会有所不同,所以,我怎么能对它进行排序呢?

如果你给我一个比总和更好的选择,它将被平等接受。

提前致谢。

6 个答案:

答案 0 :(得分:7)

你的威胁模型是什么?

如果你只是想防止随便摆弄,md5文件的主要数据,那么写md5总和到最后。要验证,请删除md5总和,然后md5仅删除原始文件。

如果你想防止恶意和熟练的破解,你就是运气不好;您可以复制您使用的任何验证算法,特别是如果它们可以访问程序本身。如果攻击者从程序二进制文件中提取密钥,即使加密签名也可能失败。

如果这是一个大问题,unix解决方案是以setuidsetgid运行给不同的用户并写入用户无法修改的目录。我不确定什么是一个好的通用Java解决方案,但重点仍然是:用户不应该修改您的数据,因为他们被阻止这样做,而不是因为他们被检测到尝试。

答案 1 :(得分:3)

虽然理论上可以制作一个自引用的MD5文件(我记得有些已被发现),但这是浪费资源。通常需要将散列存储在散列文件之外的某个位置(传统上分别命名为md5sumssha1sums)。

这就是说,除了MD5之外,我建议使用SHA-1。

答案 2 :(得分:1)

  比尔:特德,虽然我同意,但是,我们的乐队将会获得最大的胜利。事实是,在我们让Eddie Van Halen出演吉他之前,Wyld Stallyns永远不会成为超级乐队。

     特德:是的,比尔。但是,在我们有一个胜利的视频之前,我不相信我们会得到Eddie Van Halen。

     比尔:泰德,在我们拥有体面的乐器之前,有一个胜利的视频毫无意义。

     特德:嗯,当我们真的不知道怎么玩时,我们怎么能拥有体面的乐器呢?

     比尔:这就是我们需要Eddie Van Halen的原因!

     特德:这就是为什么我们需要一个胜利的视频。

     比尔,特德:优秀!

说真的,你无法用嵌入的计算哈希计算MD5总和(或其他一些哈希),所以你必须将哈希存储在其他地方。

如果您只是不希望人们轻易搞砸文件,也许可以选择通过ROT13或XOR“加密”对其进行模糊处理?

答案 3 :(得分:1)

如果您为数据创建容器怎么办?通过具有两个属性CheckSum和Data的新类,您可以序列化所有数据并将其放入Data属性中。然后,计算序列化数据的校验和,并使用CheckSum属性存储校验和。

答案 4 :(得分:0)

计算md5时,只需忽略第一行。您还应该添加一个秘密盐,以确保在编辑内容后创建新的MD5并不容易。这取决于您的实际需求(安全级别)。

答案 5 :(得分:-2)

您可以将MD5sum存储在数据库中,然后当您想要查看文件是否已更改时,请检查数据库中的MD5总和。或者,您可以将文件的md5sum存储在另一个文件中。