创建不可修改的文件

时间:2008-11-19 10:54:53

标签: encryption hash protection

我希望能够创建一个文件,将其分发给最终用户,但是阻止他们对文件进行修改。

现在,显然,我实际上无法阻止任何人修改文件 - 所以我的方法是检测并拒绝文件,如果它被修改。

我的目的是生成文件内容的盐渍哈希并将其附加到文件中。在读取时,在读取文件的其余部分之前验证散列。这样做的缺点是我必须在读取文件的可执行文件中分发固定的“salt”。显然我可以在某种程度上混淆它,但这仍然感觉像是一个薄弱的环节。

有没有更好的方法来解决这类问题?

9 个答案:

答案 0 :(得分:13)

您想在文档中添加digital signature。这是一个经过广泛研究的领域。简而言之,您可以确定该文件没有被篡改,但您无法阻止用户篡改它。

(与音乐行业的比较并不完全相关,因为他们希望阻止人们复制该文件,这是一个更难的问题。)

答案 1 :(得分:4)

如果您的应用程序在用户的计算机上运行,​​他们可以随时修补二进制文件,因此甚至不进行验证,使您的所有辛苦工作无效: - )

即使是服务器端解决方案也可以通过嗅探流量来绕过。那么你需要一个他们并使用SSL。然后他们只修补了上面的二进制文件,然后就这样了。因此,您采用各种措施来混淆二进制文件,并且您的用户会像IDA PRO一样甩掉反汇编程序。

我会问自己的问题,如果我在你的位置上,那将是“如果我与我的用户进行军备竞赛,我会赢吗?”。如果答案是否定的,那我就不会浪费我的时间。

答案 2 :(得分:3)

使用数字签名。签名是使用公钥 - 私钥加密加密的哈希。您的应用程序仅包含公钥。此密钥用于解密散列,然后验证散列。要在文件修改后“更正”哈希,用户必须计算新哈希值,使用私钥加密它,并替换文件末尾的旧哈希值。问题:他没有私钥。私钥不在您的应用中。私钥不随您的应用程序一起发货。您的应用程序只有公共应用程序。如果他用公共加密它,它将不会与公共解密,所以这是无用的。私钥在您的计算机上,没有人可以访问它。

答案 3 :(得分:1)

如果您想要100%的解决方案,那就不是了。看看电影和音乐界。他们多年来一直尝试和失败:)

我认为你的解决方案已经足够好了。为了使修改文件变得更加困难,你可以对它进行加密,但是后来它们无法读取它,所以它只有在没有限制的情况下才能工作。

答案 4 :(得分:1)

关于分发散列的问题...好的做法是使用私钥 - 公钥对进行散列和加密。而且你只需要分发公钥。这样,他们可以读取它但不能修改它或创建新的。

我建议按照JesperE的建议使用Digital Signature。这个过程是标准的,你会发现许多例子证明它。

答案 5 :(得分:1)

即使用户修补了自己的二进制文件以确保其文件的编辑副本正常工作,它的编辑副本仍然无法在未修补的计算机上运行。防止这种编辑的目的是什么?

另外,用户不像纯文本文件那样容易编辑二进制文件。此外,如果你给他们提供一个二进制文件,那么用户不会感到恼火,而不是你给他们一个带有校验和的文本文件,假设他们有一些合理的理由希望编辑它,并且可以通过查看文件告诉他们如果您没有添加校验和或其他任何内容,那么这样做很容易。

答案 6 :(得分:0)

根据您要保护的文件类型,您可以使用某些文档管理工具。 Adobe PDF提供了相应的工具。 此外,如果您在应用程序服务器或Web服务器上托管应用程序,则用户无法访问和修改代码。这样,您可以在服务器端拥有一个要保护的文件的哈希数据库。

当然,保护只会影响用户希望(或可以)投入多少时间和精力来打破保护。

答案 7 :(得分:0)

这就是md5哈希和CRC的用途,这就是为什么你从互联网上检查下载的文件与他们的md5文件,以确保它没有在途中被劫持。

无论如何我认为Roddy使用C ++所以我可以推荐Boost :: CRC非常快且开销很小,你也不需要加密文件

答案 8 :(得分:0)

您的用户是谁以及尝试更改文件的难度。如果您的用户能够找到您要添加到哈希值的盐,那么他们可能会在您的代码中找到一个公钥,将其更改为他们自己生成的公钥,并使用其私钥计算修改后的文件上的签名。我会去混淆盐。

替代方案是某种在线系统,它增加了大量的并发症,并且通常都是可以破解的。

看看HMACs是否正如您所想的那样使用“盐”的编码方法(盐被称为钥匙)。