如果您有.Net应用程序(或任何其他应用程序),您如何安全地存储内部加密密钥?我不是在谈论用户输入的密钥,而是在程序本身中硬编码的密钥,用于在程序的其他实例之间进行通信。例如,如果您有对等类型的程序,您可能希望加密数据包,以确保您正在与另一个您的程序实例进行通信,而不是其他人的实例。我的解决方案是将密钥硬编码到客户端,然后简单地加密/解密所有内容。
但是,我想知道,如果在.Net中这样做是安全的。我没有广泛使用Reflector或其他类似的东西,但从我听到的情况来看,从CIL解构.Net应用程序听起来相当容易。对于有这些应用程序之一的人来说,找到我的神奇数字是否微不足道?答案 0 :(得分:3)
绝对无法验证连接另一端的可执行文件是否是您编写的可执行文件。如果使用密钥加密密钥,则在哪里存储第二个密钥?如果您使用服务器获取密钥的Diffie-Hellman,您在哪里存储该密钥? (提示:在内存中,可以从那里读取它)。这是一个永远无法解决的递归问题。
我已经读过AOL Instant Messenger的服务器会定期轮询AIM客户端以获取特定代码地址的散列(即计算SHA1(地址1 - >地址2)),然后在散列不正确时断开客户端连接。这是因为重新分发可执行文件是不合法的(并且在每两个间隔之间构建一个哈希表是不可行的),所以这只是一个法律挑战而不是技术挑战。
如果你想要真正努力打败逆向工程的软件(并且确实做得很好),请尝试将调试器附加到Skype: - )
答案 1 :(得分:2)
您也可以尝试将自定义加密/解密算法放入C ++库,然后使用interop来来回封送数据。
答案 2 :(得分:1)
您可以生成非对称密钥(每个会话?),而不是对密钥进行硬编码。您可以将公钥发送给对等方,使用此密钥,对等方可以加密只有您可以解密的消息。
非对称加密很慢,对等方也可以发送用您的公钥编码的对称密钥,仅用于此会话。
如果您确实需要存储机密数据,可以使用ProtectedData类。你可以在安装过程中调用它来存储你的秘密(密钥)。
答案 3 :(得分:1)
如果密钥存储在程序的可执行代码中,或者存储在资源中(或者在使用可执行代码中的密钥的Windows TCB中),则可以通过足够的努力对其进行解码。
因为最终有可执行文件,所以它们拥有获得所需保护所需的所有信息(因为解码代码也已到位)。
首先:
KISS原则将为您提供良好的服务。