1

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

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

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

4

1 回答 1

0

硬编码键

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

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

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

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

单独的钥匙

如果您在单独的文件中传送密钥,则消除了在二进制文件中传送密钥所带来的所有风险,但您会引入其他风险。或者,换一种说法,既然你的加密可以做一些好事,你需要确保你做对了,否则它仍然没用。

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

于 2012-04-12T13:16:55.090 回答