如何使文件防篡改?

时间:2010-01-27 23:42:10

标签: c# security

我有一个(计划好的)商业程序正在写出一个使用日志。作为许可证的一部分,用户需要每隔几周将日志提交给公司。如何确保文件未被篡改?

系统是用C#和Winforms或WPF编写的。

更新:嗯......非常惊讶如何制作文件防篡改?被认为是“完全重复”什么技术可以保护来自完全信任的用户的秘密?无论如何,部落已经发言了。

8 个答案:

答案 0 :(得分:8)

这不仅仅是DRM问题的另一个案例,即你给用户一个密钥和一个锁,并试图确保他们不以你不想要的方式使用它吗?

即使你可以保证没有触及日志文件,你如何保证生成它的二进制文件没有被触及?这是无止境的。如果您的代码在完全由他们控制的计算机上运行,​​那么您就是SOL。

(好消息是你可能不在乎。只是把它放在合同中。小用户不想忍受提交日志文件。大企业不希望违反合同因为有很多钱岌岌可危。)

答案 1 :(得分:4)

您可以让应用程序为文件生成数字签名,但这意味着应用程序必须以某种方式包含私钥,因此用户可能会破解应用程序,以便它们可以绕过该系统。

事实上,用户可以完全控制他们的系统,并且无法防止他们在他们的系统上做特定的事情。 我建议您投入更多精力为您的软件添加有用的功能,以提高您对软件的评价程度,以便用户不太可能盗用软件。

答案 2 :(得分:4)

我看到的唯一方法是让应用程序联系远程服务器。加密文件将毫无意义,因为攻击者有程序来创建加密文件。

那么为什么不在每次需要记录某些东西时让应用程序联系远程服务器? (如果无法联系服务器,应用程序会挽救)。该程序也可以使用一些基本的密钥验证,因为...

假设程序告诉服务器“我正在做东西”,服务器发送回“Ok”并带有签名的PGP进行验证。在这种情况下,私钥将是安全的并保留在服务器上,公钥将位于客户端上,并确保服务器不会受到客户端网络的欺骗。

我假设您正在尝试记录您的程序的使用情况或类似的东西。

答案 3 :(得分:3)

略有关联,但请查看我的问题Generating a Tamper Proof Signature of some data?

共识似乎是您需要一个外部源来生成可用于对数据进行签名的签名/安全时间戳,并且如果应用程序完全是内部的,那么您大多运气不好,因为客户可以撤消设计任何校验和机制。

当然,也许在写入磁盘之前加密数据的方法“足够好” - 取决于您的客户以及获取未被禁用的日志的重要性。

答案 4 :(得分:2)

您可以将文件放在用户无权查看的目录中。当然,如果用户具有完全的,不受限制的访问权限,那么您无能为力。的没有即可。 总是是他们获取文件的一种方式(即使它是钝的和笨拙的)。

你可以对它进行加密,但是他们可以在文本编辑器中打开它并弄乱它(即使他们不知道内容是什么,添加一个字符会破坏文件)。

答案 5 :(得分:2)

使用一些密码学 - 例如签署日志文件。

附加从文件内容生成的MD5哈希值和应用程序只知道的一些“秘密”可能就足够了(请注意,通过对应用程序进行逆向工程可以轻松避免这种情况)。当然,有更多安全的方法涉及证书或其他东西,这完全取决于您的安全要求。

答案 6 :(得分:2)

您是否有机会在线发送数据,而不是先将其存储在文件中?这将使数据远离用户的系统,并要求他们破解正在运行的程序,如果他们要破解任何东西。

答案 7 :(得分:1)

正如Ken所说,这与DRM系统存在的问题相同。他们使用各种技术来存储用户不会(轻松)找到密钥的密钥。您将结合使用数字签名方案和用于存储密钥的过于复杂的方案。将它分成多个部分,分散在用户的系统上 - 注册表中的一些部分,一些文件系统中的文件,一些编码在各种无辜文件的修改日期和文件名中。此外,使代码的DRM子系统有意模糊,难以调试。

另一种选择是定期将签名数据发送到某个远程系统(如果您可以依赖于互联网连接)。