代码之家  ›  专栏  ›  技术社区  ›  dlras2

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

  •  2
  • dlras2  · 技术社区  · 14 年前

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

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

    4 回复  |  直到 14 年前
        1
  •  3
  •   Hut8    14 年前

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

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

    如果你想要的软件真的很难击败逆向工程(实际上做得很好),可以尝试在Skype上附加一个调试器:-)

        2
  •  2
  •   Ionian316    10 年前

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

        3
  •  1
  •   GvS    14 年前

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

    非对称加密速度很慢,对等方还可以发送用公钥编码的对称密钥,该密钥仅用于此会话。

    ProtectedData 班级。你可以在安装过程中调用它来存储你的秘密(密钥)。

        4
  •  1
  •   Richard    14 年前

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

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

    首先:

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

    接吻原则对你很有用。