硬编码键
如果您在 DLL 中包含共享/私有密钥,那么拥有 DLL 副本的任何人都将拥有该密钥的副本。如果您的模型要与多个用户共享您的应用程序,所有用户将拥有相同的加密密钥,并且可以解密其他用户加密的任何内容。如果您的应用程序很容易获得,那么您必须假设攻击者也拥有该应用程序(因此也拥有密钥)。
这也意味着所有开发人员都可以访问生产加密密钥,因为他们拥有源代码。QE 也可以访问,因为他们可能可以访问二进制文件。这两个内部团体中的任何一个都将能够解密您的应用程序为您的客户保护的任何内容。
这是你想要的吗?这通常是一种不好的做法,但在某些环境中比其他环境更糟糕。例如,如果您正在编写代码来学习如何编写加密货币,仅此而已,这可能无关紧要 - 只要确保没有其他人可以使用它:) 如果您正在编写服务,这是一种不好的做法并引入风险,但这不是你能做的最糟糕的事情。如果您正在编写将与多个客户共享的内容,那么您通过在二进制文件中包含密钥来破坏加密的目的。
生成随机数据(使用加密的强随机数生成器)、将其存储在文件中并使用该文件作为加密密钥并不是那么难。我的建议是使用单独的密钥。
单独的钥匙
如果您在单独的文件中传送密钥,则消除了在二进制文件中传送密钥所带来的所有风险,但您会引入其他风险。或者,换一种说法,既然你的加密可以做一些好事,你需要确保你做对了,否则它仍然没用。
密钥需要使用加密强的随机数生成器生成,因此它是不可预测的。密钥需要安全存储 - 需要保护密钥文件的整个路径,并且您应该考虑使用受密码保护的存储(如密钥库)以确保只有具有正确密码的用户才能访问密钥。当然,最后一个取决于您的部署模型,以及是否需要无人值守重启。并且需要安全地使用密钥 - 恒定顺序操作,不要执行加密或解密预言,在语义解析之前验证数据的完整性等。