我计划编写一个C#类库,其中包括我的加密算法,如RC4,DES。这些是单密钥加密算法。
现在我想要最好的安全决定来保护我的密钥。我应该将我的密钥硬编码到DLL中还是我从我的外部应用程序设置我的密钥使用DLL?当您考虑使用反编译工具时,您认为哪一个更安全?
大声思考:
从我的外部应用程序设置将使用安全DLL的键值对我来说似乎更安全。你怎么看? 感谢。
答案 0 :(得分:0)
硬编码密钥
如果您在DLL中包含共享/私钥,那么拥有该DLL副本的任何人都将拥有该密钥的副本。如果您的模型是与多个用户共享您的应用程序,则所有用户将具有相同的加密密钥,并且可以解密由其他用户加密的任何内容。如果您的应用程序很容易获得,那么您必须假设攻击者拥有应用程序(以及密钥)。
这也意味着所有开发人员都可以访问生产加密密钥,因为他们拥有源代码。 QE也可以访问,因为他们可能有权访问二进制文件。这两个内部人员组中的任何一个都能够解密您的应用程序为您的客户保护的任何标志。
这是你想要的吗?这通常是一种不好的做法,但在某些环境中它比其他环境更糟糕。例如,如果你正在编写代码来学习如何编写加密,那么它可能并不重要 - 只要确保没有其他人可以使用它:)如果你正在编写服务,这是一个不好的做法,并介绍风险,但这不是你能做的最糟糕的事情。如果您正在撰写将与多个客户共享的内容,那么您可以通过在二进制文件中包含密钥来破解加密的目的。生成随机数据(使用加密强大的随机数生成器),将其存储在文件中,并将该文件用作加密密钥并不是那么难。我的建议是使用单独的密钥。
单独的密钥
如果您将密钥发送到单独的文件中,则可以消除在二进制文件中传送密钥所带来的所有风险,但您可以介绍其他文件。或者,换句话说,既然你的加密可以做些好事,你需要确保你做得对,否则它仍然没用。
密钥需要使用加密强大的随机数生成器生成,因此无法预测。密钥需要安全存储 - 密钥文件的整个路径需要受到保护,您应该考虑使用受密码保护的存储(如密钥库),以确保只有拥有正确密码的用户才能访问密钥。当然,最后一个取决于您的部署模型,以及是否需要无人值守重启。密钥需要安全使用 - 常量命令操作,不要加密或解密oracle,在语义解析之前验证数据的完整性等等。