2

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

但是,我想知道在.Net 中这样做是否安全。我没有广泛使用 Reflector 或类似的东西,但据我所知,从 CIL 解构 .Net 应用程序听起来相当容易。对于拥有这些应用程序之一的人来说,去寻找我的幻数会是微不足道的吗?

4

4 回答 4

3

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

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

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

于 2010-08-05T21:12:04.180 回答
2

您还可以尝试将自定义加密/解密算法放入 C++ 库中,然后使用互操作来来回编组数据。

于 2014-02-28T19:14:59.263 回答
1

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

非对称加密很慢,你的对等方也可以发送一个用你的公钥编码的对称密钥,它只用于这个会话。

如果确实需要存储机密数据,可以使用ProtectedData类。您可以在设置期间调用它,以存储您的秘密(密钥)。

于 2010-08-05T20:54:34.190 回答
1

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

因为最终与可执行文件一起,他们拥有获得它所需的所有信息,无论您添加什么保护(因为解码代码也已到位)。

首先:

  • 不要创建自己的机制,有太多简单的方法可以破坏安全性(专家通常需要多次尝试才能正确)。
  • 想想你试图保护的东西的价值,以及那些可能攻击它的人可用的资源。如果保护的价值很小,你就不需要那么多保护。
  • 除非您要保护像Aldermaston这样的地方,否则您不需要High Security

KISS 原则会很好地为您服务。

于 2010-08-05T21:04:37.477 回答