我正在使用Rijndael Managed类通过我的代码加密一些数据。我也使用固定密码和Rfc2898DeriveBytes类的盐生成Key和IV。 但是我没有在DB中明确地存储这些(密钥,IV,密码,Salt),相反,我在代码中生成它们,将它们存储在会话变量中,并在应用程序运行时将它们用于加密和解密。所以,一切都在我编译的dll中。这种做法安全吗?我不想打败加密的唯一目的。
答案 0 :(得分:1)
不,这不是一个好的密钥管理实践,但也不是将它们存储在应用程序的数据库中。
理想情况下,密钥应存储在无法提取的硬件安全模块中。但是,因为对于大多数应用程序而言,这通常不是一个选项,在Windows上(我假设你正在使用,因为这是一个.NET应用程序)你有DPAPI,你可以使用它来存储密钥,或者最简单的选项,您可以使用加密的配置部分来保护它们。
顺便说一句,我可能会重新考虑使用密码和KDF。如果您的应用程序不需要用户记住并输入密码,例如独立于用户使用密钥的Web应用程序,则通常更好的做法是简单地生成强随机密钥,并将其存储直接而不是密码和盐,并且必须得到密钥。