2010-08-05 272 views
2

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

但是,我想知道,如果这在.NET中是安全的。我没有广泛使用Reflector或类似的东西,但从我所听到的,解开CIL的.Net应用程序听起来相当容易。对于有这些应用程序之一的人来说,是否会发现我的魔法数字是微不足道的?

+1

您需要查看混淆软件。 – 2010-08-05 21:10:05

回答

3

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

我读过AOL即时通讯服务器会定期轮询AIM客户端的特定代码地址(即计算SHA1(address1 - > address2))的哈希,然后断开客户端,如果哈希不正确。这是因为重新分配可执行文件是非法的(并且在每两个时间间隔之间建立一个散列表是不可行的),所以这仅仅是一个法律挑战,而不是技术问题。

如果你想真正力图打败逆向工程(实际上做得很好)软件,尝试附加一个调试器的Skype :-)

+0

一年后的追踪:http://www.theregister.co.uk/2011/06/03/open_sourcing_skype/ - 因此放弃了保护分发给客户的任何东西的所有希望:-PI对Skype的效力感到非常印象直到今年6月份才进行反向逆向工程。 – Hut8 2011-06-27 06:48:11

1

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

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

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

+0

但是'byte [] secret = {0,1,2,3,4,1,2,3,4};'只需打开Reflector中的.exe就可以看到? – dlras2 2010-08-05 21:01:12

+0

是的,如果这在你的代码中,它将是可读的。 – GvS 2010-08-05 21:07:07

+1

如果你把它放在另一个DLL中,并将该DLL嵌入到你的程序集中,它不会在反射器中打开......但它仍然可以被提取并打开。通过分层保护并将反编译提升到一个大多数人不会感到困扰的级别,就是使用纯粹的托管代码所能做的一切。 – 2010-08-09 10:28:16

1

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

由于最终的可执行文件中包含了所有需要的信息,因此无论您添加什么保护措施(因为解码代码也在其中)。

首先:

  • 不要创建自己的机制,有太多的简单的方法来危及安全(专家往往需要多次尝试得到它的权利)。
  • 想想你想要保护什么的价值,以及那些可能攻击它的人可用的资源。如果没有什么价值来保护你,就不需要太多的保护。
  • 除非你保护某个地方如Aldermaston你不需要安全

KISS原则将为您服务。

2

您也可以尝试在你的自定义的加密/解密算法将转换为C++库,然后使用interop来回编组数据。