如何避免将数据库密码以明文形式存储在源代码中?
-
09-06-2019 - |
题
在我正在开发的网络应用程序中,我目前在连接到数据库时使用一个简单的解决方案:
Connection c = DriverManager.getConnection("url", "username", "password");
这是相当不安全的。如果攻击者获得了源代码的访问权限,他也获得了数据库本身的访问权限。我的 Web 应用程序如何连接到数据库而不将数据库密码以明文形式存储在源代码中?
解决方案
您可以将连接字符串存储在 Web.config 或 App.config 文件中,并加密保存它的部分。这是我在之前的项目中使用的一篇非常好的文章来加密连接字符串:
http://www.ondotnet.com/pub/a/dotnet/2005/02/15/encryptingconnstring.html
其他提示
在 .NET 中,惯例是将连接字符串存储在单独的配置文件中。
就此而言, 配置文件可以加密.
如果您使用的是 Microsoft SQL Server,那么当您使用域帐户运行应用程序(然后应用程序使用与数据库的可信连接)时,这一切都变得无关紧要。在这种情况下,连接字符串将不包含任何用户名和密码。
我可以向 .NET 程序员推荐这些技术:
- 加密配置文件中的密码\连接字符串
- 在客户端和服务器之间建立可信连接(即使用 Windows 身份验证等)
以下是来自 CodeProject 的有用文章:
除非我错过了这一点,否则连接应该由服务器通过连接池管理,因此连接凭据由服务器而不是应用程序保存。
更进一步,我通常会建立一个约定,其中前端 Web 应用程序(在 DMZ 中)仅通过 Web 服务(在域中)与数据库通信,因此提供完全分离和增强的数据库安全性。
另外,切勿向数据库帐户授予超出基本需要的权限。
另一种方法是通过存储过程执行所有操作,并仅授予应用程序用户对这些过程的访问权限。
假设您使用的是 MS SQL,您可以利用 Windows 身份验证,它不需要源代码中任何位置的用户名/密码。否则我将不得不同意其他海报推荐 app.config + 加密。
- 创建操作系统用户
- 将密码放入该用户的操作系统环境变量中
- 以该用户身份运行程序
优点:
- 只有 root 或该用户才能查看该用户的操作系统环境变量
- 重启后仍可正常运行
- 您永远不会意外地将密码签入源代码管理
- 您无需担心搞砸文件权限
- 您无需担心加密密钥的存储位置
- 适用于 x 平台