我不会说在 Web.config 中存储明文密码本身就是一个安全漏洞。但是加密密码是一种有用的纵深防御措施,而不仅仅是通过默默无闻的安全性:
- 如果 IIS 配置错误以提供 Web.config 服务怎么办?
- 如果在 ASP.NET 中发现了允许任何人下载 Web.config的安全漏洞(如padding oracle 漏洞)怎么办?
- 对 Web 服务器有不同程度的访问,从完全管理权限到服务器端代码注入。如果攻击者只能设法做到后者,他可能能够读取 Web.config 但可能无法访问机器密钥,尤其是当您的应用程序在部分信任下运行时。
最后,由您决定在 Web.config 中存储明文密码的风险是否可接受。当然,如果 Windows 身份验证是一个选项,那么您可能需要考虑使用它而不是 SQL 身份验证。
更新:在谈论安全性时,识别资产和威胁是个好主意。在这种情况下,资产是数据库中的敏感数据(如果数据不重要,那为什么还要用密码保护它呢?),威胁是攻击者可能以某种方式获得对 Web.config 和数据库的访问权限也是。一种可能的缓解方法是在 Web.config 中加密数据库密码。
有多大的风险?我们真的必须为这种天文数字般罕见的事件做好计划吗?
这种缓解已经一次证明了它的价值:当发现 ASP.NET padding oracle 漏洞时。任何在 Web.config 中存储明文密码的人都处于危险之中;任何加密密码的人都不是。您有多大把握在未来几年内不会发现 ASP.NET 中的另一个类似漏洞?
我们是否还应该加密源代码并在运行时解密?对我来说似乎太过分了。
那么,如果攻击者确实可以访问您的源代码怎么办?您要保护的资产是什么,您担心的威胁是什么?我认为在很多情况下,源代码的价值远低于数据。(我在这里考虑的是任何人都可以获得的现成的商业和开源软件。)如果您的源代码很有价值,那么可能需要考虑混淆。
我觉得如果他们已经对您的盒子进行了有限的访问,那么您的主机已经失败或者您已经安装了易受攻击的服务。
ASP.NET 或您的代码中的安全漏洞怎么样?它们确实不时弹出。
我关心的是标准做法。是标准吗?
Microsoft建议对连接字符串进行加密。
您应该做的是评估存储明文密码带来的风险:
- 攻击者能够发现和利用暴露 Web.config 的安全漏洞的可能性有多大?根据过去的历史,我会说可能性很低(但不是“天文数字”低)。
- 您的数据有多有价值或有多敏感?如果您存储的只是猫的照片,那么攻击者是否获得您的数据库密码可能并不重要。但是,如果您要存储个人身份信息,那么从法律的角度来看,我会说您应该采取一切可能的措施来保护您的应用程序,包括加密您的连接字符串。