你如何安全地在.Net中存储加密密钥?

时间:2010-08-05 20:49:28

标签: .net encryption reflector

如果您有.Net应用程序(或任何其他应用程序),您如何安全地存储内部加密密钥?我不是在谈论用户输入的密钥,而是在程序本身中硬编码的密钥,用于在程序的其他实例之间进行通信。例如,如果您有对等类型的程序,您可能希望加密数据包,以确保您正在与另一个您的程序实例进行通信,而不是其他人的实例。我的解决方案是将密钥硬编码到客户端,然后简单地加密/解密所有内容。

但是,我想知道,如果在.Net中这样做是安全的。我没有广泛使用Reflector或其他类似的东西,但从我听到的情况来看,从CIL解构.Net应用程序听起来相当容易。对于有这些应用程序之一的人来说,找到我的神奇数字是否微不足道?

4 个答案:

答案 0 :(得分:3)

绝对无法验证连接另一端的可执行文件是否是您编写的可执行文件。如果使用密钥加密密钥,则在哪里存储第二个密钥?如果您使用服务器获取密钥的Diffie-Hellman,您在哪里存储该密钥? (提示:在内存中,可以从那里读取它)。这是一个永远无法解决的递归问题。

我已经读过AOL Instant Messenger的服务器会定期轮询AIM客户端以获取特定代码地址的散列(即计算SHA1(地址1 - >地址2)),然后在散列不正确时断开客户端连接。这是因为重新分发可执行文件是不合法的(并且在每两个间隔之间构建一个哈希表是不可行的),所以这只是一个法律挑战而不是技术挑战。

如果你想要真正努力打败逆向工程的软件(并且确实做得很好),请尝试将调试器附加到Skype: - )

答案 1 :(得分:2)

您也可以尝试将自定义加密/解密算法放入C ++库,然后使用interop来来回封送数据。

答案 2 :(得分:1)

您可以生成非对称密钥(每个会话?),而不是对密钥进行硬编码。您可以将公钥发送给对等方,使用此密钥,对等方可以加密只有您可以解密的消息。

非对称加密很慢,对等方也可以发送用您的公钥编码的对称密钥,仅用于此会话。

如果您确实需要存储机密数据,可以使用ProtectedData类。你可以在安装过程中调用它来存储你的秘密(密钥)。

答案 3 :(得分:1)

如果密钥存储在程序的可执行代码中,或者存储在资源中(或者在使用可执行代码中的密钥的Windows TCB中),则可以通过足够的努力对其进行解码。

因为最终有可执行文件,所以它们拥有获得所需保护所需的所有信息(因为解码代码也已到位)。

首先:

  • 不要创建自己的机制,有太多简单的方法来破坏安全性(专家经常需要多次尝试才能做到正确)。
  • 考虑您要保护的内容的价值,以及可能攻击它的人可用的资源。如果保护的价值不大,则不需要那么多保护。
  • 除非您要保护Aldermaston之类的地方,否则您不需要 安全

KISS原则将为您提供良好的服务。