在这项工作中,我们正在开发一个 ASP.NET MVC 应用程序以进行概念验证。应用程序执行的某些操作需要传输凭据,因此我们将这些凭据存储在 web.config 的加密部分中。我们遇到的困难是,当一个开发人员加密数据并提交它时,下一个更新他的本地副本并尝试使用该 web.config 的开发人员会遇到异常,因为他们的机器无法解密配置以供使用。
我们应该如何处理?
在这项工作中,我们正在开发一个 ASP.NET MVC 应用程序以进行概念验证。应用程序执行的某些操作需要传输凭据,因此我们将这些凭据存储在 web.config 的加密部分中。我们遇到的困难是,当一个开发人员加密数据并提交它时,下一个更新他的本地副本并尝试使用该 web.config 的开发人员会遇到异常,因为他们的机器无法解密配置以供使用。
我们应该如何处理?
过去,我将 machine.config 用于敏感凭据,即连接字符串等。它位于 C:\Windows\Microsoft.Net\Framework\V4.0.30319\Config
这将允许您完全省略提交中的凭据。只需确保每个开发人员和/或服务器都有自己的 machine.config 和所需的凭据设置。
我假设您正在使用aspnet_regiis.exe来加密该部分。如果是这种情况,您遇到问题的原因是机器上用于加密/解密的密钥不同。
您可以在所有机器上使用相同的密钥,从配置角度来看,这类似于场设置,因此您可以使用此SO question中的信息。
或者,由于存在一个固有的假设,即开发人员可以访问凭据,因此在将应用程序部署到生产服务器然后加密该部分之前将其解密。当用户名/密码在 web.config 中指定为数据库连接的连接字符串的一部分时,这是一种常见的解决方案,连接将被更新以反映生产数据库服务器作为部署过程的一部分,就在加密之前。
首先,当在 DevOps 最佳实践中有其他更好的方法来处理密钥机密时,不确定为什么选择此选项。这似乎是经典的方式。同样在调试期间,任何开发人员都可以查看实际值或在日志中吐出?
无论如何,如果你把整个交付生命周期作为这个问题的上下文,我可能会在这里做些什么来实现你试图保护密钥的秘密:
希望这至少对您的设计方法有所帮助。