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

如何在.NET程序集中安全存储加密密钥

  •  10
  • Alex  · 技术社区  · 15 年前

    为了防止有人轻易获取我的数据,我将服务中的数据缓存为加密文件(基本上是复制保护)。

    但是,为了做到这一点,我必须将加密密钥存储在.NET程序集中,以便它能够加密和解密这些文件。

    意识到像Red Gate的.NET Reflector这样的工具可以直接拔出我的钥匙,我觉得这不是一种非常安全的方法…这样做有什么最佳实践吗?

    3 回复  |  直到 15 年前
        1
  •  11
  •   MaxGuernseyIII    15 年前

    你必须决定什么是可接受的风险水平。这样做没有“安全”的方法。

    如果有人使用Reflector,或者只是使用System.Reflection.Assembly类打开程序集并以这种方式获取资源的风险太大,那么下一步可能是在启动时从服务器下载密钥。

    然后,在使用代码时,必须有人执行类似于调试的操作,并以这种方式获取密钥。您可以使缓存的内容过期并交换密钥。您可以这样做,每个人都有自己的密钥来保护一个用户的数据不受另一个用户的影响。

    你可以做很多事情,但是如果你的目标是阻止某人解密你在他们机器上安装的程序集能够解密的信息,你应该知道这几乎是不可能的。你所能做的就是 成本 复制你的钥匙/数据;你不能阻止它。

        2
  •  0
  •   lexu    15 年前

    您不能阻止描述,但可以阻止对伪造数据重新加密:

    只要您的代码运行在其他人可以访问的计算机上,就无法阻止他们检查程序。然而,反编译和分析需要花费时间。正如Maxguernseyiii指出的,这一切都是关于可接受的威胁级别。

    在您的案例中,问题不在于黑客可以反编译您的代码,而是在于他们可以更改您想要保护的数据(谁拥有许可证)。

    所以你可以使用 public key cryptography 加密数据的方法。这样黑客就可以阅读,但他不能重新加密。

        3
  •  0
  •   Noon Silk    15 年前

    正如Max所暗示的,您需要考虑一个威胁模型。

    你担心什么样的攻击者?(关心某些人是合法的,而关心其他人是不合法的)。典型的类别可以是“购买程序的非计算机用户”、“愿意花费数小时研究解决方案的专业人员”、“知道如何在网上找到漏洞的临时用户”等。

    根据您的具体情况,解决方案可能会有所不同。

    值得注意的一个有趣/悲伤的项目是,如果你的产品很受欢迎,那么只有一两个专门的人坐下来打破它,然后释放补丁给所有人。我想,这就是软件的本质,当您的整个应用程序在它们的机器上运行时,这是一个未解决的问题。

    很明显,这意味着,如果你的应用程序作为一个网站运行,也就是说,它在你控制的机器上运行,这不是一个问题。

    我知道这不是一个特别有用的答案。

    推荐文章