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

如何在.Net中安全地存储加密密钥?,.net,encryption,reflector,.net,Encryption,Reflector,如果您有一个.Net应用程序(或任何其他应用程序),如何安全地存储内部加密密钥?我说的不是用户输入的键,而是程序本身硬编码的键,用于在程序的其他实例之间进行对话。例如,如果您有一个点对点类型的程序,您可能希望加密数据包,以确保您正在与您的程序的另一个实例而不是其他人的程序进行通信。我的解决方案是将一个密钥硬编码到客户端,然后简单地以这种方式对所有内容进行加密/解密 然而,我想知道在.Net中这样做是否安全。我没有广泛地使用Reflector或类似的东西,但据我所知,从CIL解构.Net应用程序听

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


然而,我想知道在.Net中这样做是否安全。我没有广泛地使用Reflector或类似的东西,但据我所知,从CIL解构.Net应用程序听起来相当容易。对于使用这些应用程序的人来说,找到我的神奇数字会很简单吗?

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

非对称加密速度较慢,您也可以向对等方发送用公钥编码的对称密钥,该密钥仅用于此会话


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

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

因为最终,对于可执行文件,无论您添加了什么保护(因为解码代码也已准备就绪),它们都拥有获得该文件所需的所有信息

首先:

  • 不要创建自己的机制,有太多容易破坏安全性的方法(专家通常需要多次尝试才能使其正确)
  • 想想你试图保护的东西的价值,以及那些可能攻击它的人可以利用的资源。如果没有什么价值可以保护,你就不需要那么多保护
  • 除非你在保护一个不需要高度安全的地方

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

绝对无法验证连接另一端的可执行文件是否就是您编写的。如果用密钥加密密钥,第二个密钥存储在哪里?如果你把Hellman的密码和服务器的密码区别开来,你把密码存放在哪里?(提示:在内存中,可以从中转储,然后读取)。这是一个你永远无法解决的递归问题

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


如果你真的想尝试反工程(实际上做得不错)的软件,试着把调试器附加到Skype:-(

> P)你也可以尝试把你的自定义加密/解密算法放进C++库中,然后使用互操作来来回地整理数据。

但将<代码>字节[]秘密={ 0, 1, 2, 3, 4, 1, 2, 3, 4 }只需在Reflector中打开.exe就可以看到吗?如果你将它放在另一个dll中并将该dll嵌入到你的程序集中,它不会在Reflector中打开……但它仍然可以被提取和打开。分层保护并将反编译的门槛提高到大多数人都不会打扰的水平,这是纯托管的co所能做的一切de.你的应用程序值多少钱?我现在的工资是每小时0美元,我是调试器的怪兽:-)Re ProtectedData:阅读类/方法文档时,它说保护依赖于当前用户帐户。考虑到其他用户将运行的应用程序,这会有什么帮助?如果你在Y下构建密钥时对其进行了保护我们的用户帐户,您将是唯一一个能够检索该密钥/运行该软件的用户。没有其他用户能够正确运行该软件,因此无法分发。对吗?@toolmakersteve,您也可以在范围内使用“LocalMachine”。您需要研究模糊处理软件。一年后跟进:--因此放弃所有h保护分发给客户的任何东西的作用:-P直到今年6月,Skype的反逆向工程的有效性给我留下了深刻印象。