【问题标题】:How to safely store encryption key in a .NET assembly如何在 .NET 程序集中安全地存储加密密钥
【发布时间】:2010-03-27 06:47:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net encryption compact-framework key-storage


    【解决方案1】:

    您必须确定可接受的风险水平。没有“安全”的方式来做到这一点。

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

    然后有人将不得不在使用您的代码时执行诸如调试之类的操作并以这种方式获取密钥。您可以使缓存的内容过期并换出密钥。您可以让每个人都拥有自己的密钥,以保护一个用户的数据不被其他用户访问。

    您可以做很多事情,但如果您的目标是阻止某人解密您放置在他们机器上的程序集能够解密的信息,那么您应该知道这几乎是不可能的。您真正能做的就是提高盗版密钥/数据的成本;你无法阻止它。

    【讨论】:

    • +1 指出黑客的无用性和成本,但他也应该尽量减少影响(请参阅我的回答以尝试解释我的意思)
    • 是的,在阅读了您的帖子并仔细考虑之后,我认为这一切都归结为成本/风险评估。我想出了一个计划,它可能会阻止大多数人尝试,拯救最精通计算机的 5-10% 的用户,这是一个“可接受的”风险。
    • 我很高兴。你可能做出了正确的决定,如果没有,你可以随时改变它。 ;)
    【解决方案2】:

    您无法阻止解密,但可以阻止伪造数据的重新加密:

    只要您的代码在其他人可以访问的计算机上运行,​​您就无法阻止他们检查程序。然而,反编译和分析确实需要时间。正如 MaxGuernseyIII 所指出的,这完全取决于可接受的威胁水平。

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

    因此您可以使用public key cryptography 方法来加密数据。这样黑客可以读取,但不能重新加密。

    【讨论】:

    • 公钥密码学在这里无济于事,据我所知(而且,你永远不会直接使用 PK 系统(至少是 RSA)来加密数据;它应该只用于加密对称算法(例如 AES)的密钥)。
    • 即便如此,足够熟练的黑客也可以绕过它。拆卸,换上你自己的钥匙,轰隆隆。加密的东西突然变得可读了。您可以通过在服务器端对其进行签名来防止该数据被反馈到服务器,但是……您是对的。这完全取决于实际需要是什么;就像许多这样的问题一样。
    • 没有重新加密问题,缓存的文件是用户付费访问的录音片段,当他们的订阅到期时,我不希望他们能够再访问它们。
    • @MaxGuernseyIII:您对本地(对客户端)的影响是正确的......当代码在不受保护的环境中运行时,它必须被认为是可疑的......'thread' :-) 级别以及所有这些。
    【解决方案3】:

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

    您担心什么样的攻击者? (关心某些人是合理的,关心其他人就不那么合理了)。典型的类别可能是“购买程序的非计算机用户”、“愿意在解决方案上花费数小时的专职人员”、“知道如何在网上找到漏洞的普通用户”等。

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

    需要注意的一个有趣/可悲的事情是,如果您的产品很受欢迎,那么只需要一两个专门的人坐下来打破它,然后为所有人发布补丁。这就是软件的本质,我想,当你的整个应用程序在他们的机器上运行时,这是一个未解决的问题。

    显然,这意味着如果您的应用程序作为网站运行 - 即它在您控制的机器上,这不是问题。

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

    【讨论】:

    • 你的意思是我暗示要考虑一个“威胁”模型吗? ;)
    • @MaxGuernseyIII:哎呀..在写这篇文章时猜我在做什么没有奖品:P
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 2015-07-04
    • 2014-06-24
    • 2018-03-16
    • 1970-01-01
    • 2012-01-11
    • 2015-11-24
    相关资源
    最近更新 更多