【问题标题】:Encryption to protect files from changes加密以保护文件不被更改
【发布时间】:2010-11-08 02:49:36
【问题描述】:

我最近阅读了一些关于加密的内容,并且对保护许可证文件不被篡改感兴趣。现在这可能不是最好的方法,在这种情况下,我愿意接受建议。但我想保护它的一种方法是简单地加密它。

但是,如果我要使用加密,我需要使用对称密钥,但这提出了一个问题。如果我在源代码中存储一个密钥,使用反射器之类的工具,真的值得吗?获取初始化向量、盐、密钥等似乎是一项相当简单的任务,从而破坏加密。有没有办法保护源中的密钥?或者这是完全错误的方法?

【问题讨论】:

  • 我认为您需要澄清问题并告诉我们谁有兴趣篡改文件。 IE。 Marc 的 anwser 假设第三方篡改了文件。大多数其他答案都假设客户本人对篡改文件感兴趣,例如为了规避限制。如果您要描述一个清晰的攻击模型,那么这将有助于确定正确的答案。

标签: c# encryption reverse-engineering


【解决方案1】:

如果您想防止篡改,您需要签名/散列,而不是加密。类似的理论 - 但这意味着您可以在应用中使用公钥验证文件,而不需要您保留在服务器上的私钥(并用于颁发许可证)。

搜索加密哈希/签名。

【讨论】:

  • 数字签名根据受信任的公共证书进行验证。如果有人启动反射器以从程序中提取密钥,他们可以轻松地交换受信任的公钥。
  • 谢谢 Marc,我确实短暂地认为散列可能是另一种方式。我真的不太了解的东西。我实际上认为这可能会遇到类似的问题,反映并找出文件是如何散列的,以便有人可以随意进行更改。如果它像加密一样工作,那么不对称方法可能正是我所需要的。我会看看它。谢谢
  • 正如 Marc 提到的,基本上你想使用像 GPG 这样的公钥/私钥加密,并用你的私钥签署许可证。程序会用对应的公钥验证签名,确保签名后没有被篡改。
  • 正如 Clemahieu 所提到的,理论上有人可以发布他们自己的密钥对,替换程序使用的公钥,生成并签署他们自己的许可证 - 但是这将是很多工作,并且涉及篡改与程序本身(假设密钥存储在可执行文件中)。您可以计算公钥的 MD5sum 并确保它也与硬编码值匹配,但是任何拥有调试器的人都将能够绕过许可证文件,无论您做什么。
【解决方案2】:

系统客户端的任何东西都可能受到破坏。

如果您加密您的文件,您还必须以某种方式将解密密钥放入您的程序中。任何拥有十六进制编辑器的人都可以单步执行您的代码以找到此密钥,然后解密您的许可证文件并为您的系统创建密钥。

Internet 激活是一个不错的方法,但我想看看您是否可以找到第三方来为您执行此操作,因为他们以前会走这条路。

也就是说,通过一些 AES 256 加密运行您的许可证文件不会受到伤害:)。

【讨论】:

  • 谢谢,我想可能是这样。
【解决方案3】:

如果您谈论的是 MS/.NET 环境,我建议您使用DPAPI。 它是一个 API,用于存储受密码保护的数据。然后你可以问我“但是我有同样的问题”,答案是否定的,因为在这种情况下你使用用户密码来保护你的数据。因此,要访问您的数据,您必须做的是在特定凭据下运行您的应用程序。在 MS 环境下,它是最好的解决方案。

来自文档:

DPAPI 专注于为用户提供数据保护。由于它需要密码来提供保护,因此 DPAPI 以某种方式使用用户的登录密码是合乎逻辑的步骤。 DPAPI 实际上使用用户的登录凭据。在用户使用密码登录的典型系统中,登录凭证只是用户密码的哈希值。然而,在用户使用智能卡登录的系统中,凭证会有所不同。为简单起见,我们将使用术语用户密码、登录密码或仅密码来指代此凭据。

【讨论】:

    【解决方案4】:

    您正在尝试的是 DRM;在当前的 PC 硬件上没有 100% 的方法可以做到这一点。您可以采取许多措施来混淆程序的某些部分。这是在您想要混淆多少与您想让付费客户通过多少障碍之间进行权衡。

    【讨论】:

    • 感谢您的回答,我确实认为混淆可能会有所帮助,但是即使进行了混淆,它也可能是程序中相当容易隔离的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2020-04-01
    • 2010-09-22
    相关资源
    最近更新 更多