如何安全地在.Net中存储加密密钥?
如果您有.Net应用程序(或任何其他应用程序),您如何安全地存储内部加密密钥?我不是在谈论用户输入的密钥,而是在程序本身中硬编码的密钥,用于在程序的其他实例之间进行交谈。例如,如果您有对等类型程序,则可能需要加密数据包,以确保您正在与另一个程序实例通信,而不是其他人的程序。我的解决方案是将密钥硬编码到客户端,并简单地加密/解密所有内容。如何安全地在.Net中存储加密密钥?
但是,我想知道,如果这在.NET中是安全的。我没有广泛使用Reflector或类似的东西,但从我所听到的,解开CIL的.Net应用程序听起来相当容易。对于有这些应用程序之一的人来说,是否会发现我的魔法数字是微不足道的?
绝对没有办法验证连接另一端的可执行文件是否是您写的。如果您使用密钥加密密钥,那么您在哪里存储第二个密钥?如果你的Diffie-Hellman用服务器获得密钥,你在哪里存储密钥? (提示:在内存中,它可以从那里读取)。这是一个你永远无法解决的递归问题。
我读过AOL即时通讯服务器会定期轮询AIM客户端的特定代码地址(即计算SHA1(address1 - > address2))的哈希,然后断开客户端,如果哈希不正确。这是因为重新分配可执行文件是非法的(并且在每两个时间间隔之间建立一个散列表是不可行的),所以这仅仅是一个法律挑战,而不是技术问题。
如果你想真正力图打败逆向工程(实际上做得很好)软件,尝试附加一个调试器的Skype :-)
一年后的追踪:http://www.theregister.co.uk/2011/06/03/open_sourcing_skype/ - 因此放弃了保护分发给客户的任何东西的所有希望:-PI对Skype的效力感到非常印象直到今年6月份才进行反向逆向工程。 – Hut8 2011-06-27 06:48:11
而不是硬编码密钥,您可以生成一个非对称密钥(每个会话?)。您可以使用此密钥将公钥发送给对等方,对等方可以加密只有您可以解密的消息。
非对称加密速度慢,您的对等方也可能发送使用您的公钥编码的对称密钥,仅用于此会话。
如果您确实需要存储机密数据,则可以使用ProtectedData类。你可以在安装过程中调用它来存储你的秘密(密钥)。
如果密钥存储在程序的可执行代码或资源中(或者在Windows TCB中使用可执行代码中的密钥),则可以通过足够的努力将其解码。
由于最终的可执行文件中包含了所有需要的信息,因此无论您添加什么保护措施(因为解码代码也在其中)。
首先:
- 不要创建自己的机制,有太多的简单的方法来危及安全(专家往往需要多次尝试得到它的权利)。
- 想想你想要保护什么的价值,以及那些可能攻击它的人可用的资源。如果没有什么价值来保护你,就不需要太多的保护。
- 除非你保护某个地方如Aldermaston你不需要高安全。
KISS原则将为您服务。
您也可以尝试在你的自定义的加密/解密算法将转换为C++库,然后使用interop来回编组数据。
您需要查看混淆软件。 – 2010-08-05 21:10:05