C# 中加密的显式或隐式密钥

本文关键字:密钥 加密 | 更新日期: 2023-09-27 18:30:48

我计划编写一个C#类库,其中包括我的加密算法,如RC4,DES。这些是单密钥加密算法。
现在,我想要最好的安全决定来保护我的密钥。我应该将密钥硬编码在 DLL 中,还是应该从使用该 DLL 的外部应用程序设置密钥?当您考虑分解工具时,您认为哪一个更安全?
大声思考:

  • 如果密钥在我的安全库中进行了硬编码,并且有人找到了 DLL 并将其导入到他的 C# 应用程序中,他可以轻松解码我的削片机数据吗?
  • 如果密钥不是在我的安全库中硬编码,而是从我的外部应用程序设置的,那么有人还需要反编译我的外部应用程序才能找到我的密钥?

从将使用安全 DLL 的外部应用程序中设置键值对我来说似乎更安全。你觉得怎么样?
谢谢。

C# 中加密的显式或隐式密钥

硬编码密钥

如果在 DLL 中包含共享/私钥,则拥有 DLL 副本的任何人都将拥有密钥的副本。 如果您的模型要与多个用户共享您的应用程序,则所有用户将具有相同的加密密钥,并且可以解密其他用户加密的任何内容。 如果您的应用程序很容易获得,那么您必须假设攻击者也拥有应用程序(因此也拥有密钥)。

这也意味着所有开发人员都可以访问生产加密密钥,因为他们拥有源代码。 量化宽松也将可以访问,因为他们可能可以访问二进制文件。 这两个内部组中的任何一个都能够解密应用程序为客户保护的任何内容。

这是你想要的吗? 这通常是一种不好的做法,但在某些环境中比其他环境更糟糕。 例如,如果您正在编写代码来学习如何编写加密货币,仅此而已,这可能无关紧要 - 只需确保没有其他人可以使用它:) 如果您正在编写服务,这是一种不好的做法并会带来风险,但这并不是您可以做的最糟糕的事情。 如果您正在编写将共享给多个客户的内容,那么通过将密钥包含在二进制文件中来破坏加密的目的。

生成随机数据(使用加密强度高的随机数生成器),将其存储在文件中,并将该文件用作加密密钥并不难。 我的建议是使用单独的密钥。

单独的密钥

如果在单独的文件中传送密钥,则可以消除以二进制文件形式传送密钥所带来的所有风险,但会引入其他风险。 或者,换句话说,既然您的加密货币可以做一些好事,您需要确保自己做得对,否则它仍然毫无用处。

密钥需要使用加密强度高的随机数生成器生成,因此无法预测。 密钥需要安全存储 - 密钥文件的整个路径需要受到保护,并且应考虑使用受密码保护的存储(如密钥库),以确保只有具有正确密码的用户才能访问密钥。 当然,最后一个取决于您的部署模型,以及是否需要无人参与的重新启动。 并且密钥需要安全地使用 - 恒定的顺序操作,不要执行加密或解密预言机,在语义解析之前验证数据的完整性等。