28

在我正在开发的网络应用程序中,我目前在连接到数据库时使用了一个简单的解决方案:

Connection c = DriverManager.getConnection("url", "username", "password");

这是相当不安全的。如果攻击者获得了对源代码的访问权,他也获得了对数据库本身的访问权。我的 Web 应用程序如何在不将数据库密码以明文形式存储在源代码中的情况下连接到数据库?

4

6 回答 6

17

您可以将连接字符串存储在 Web.config 或 App.config 文件中并加密保存它的部分。这是我在之前的项目中用来加密连接字符串的一篇非常好的文章:

http://www.ondotnet.com/pub/a/dotnet/2005/02/15/encryptingconnstring.html

于 2008-09-03T23:32:35.090 回答
5

在 .NET 中,约定是将连接字符串存储在单独的配置文件中。

这样就可以对配置文件进行加密了。

如果您使用的是 Microsoft SQL Server,那么如果您使用域帐户来运行应用程序,那么这一切都变得无关紧要,然后该应用程序使用与数据库的受信任连接。在这种情况下,连接字符串将不包含任何用户名和密码。

于 2008-09-03T23:34:10.170 回答
1

我可以向 .NET 程序员推荐这些技术:

  • 在配置文件中加密密码\连接字符串
  • 在客户端和服务器之间设置可信连接(即使用 windows auth 等)

以下是来自 CodeProject 的有用文章:

于 2008-09-03T23:34:06.100 回答
1

除非我错过了这一点,否则连接应该由服务器通过连接池管理,因此连接凭据由服务器而不是应用程序持有。

更进一步,我通常会建立一个约定,即前端 Web 应用程序(在 DMZ 中)仅通过 Web 服务(在域中)与 DB 对话,因此提供了完全分离和增强的 DB 安全性。

此外,永远不要给予数据库帐户超过或超过基本需要的权限。

另一种方法是通过存储过程执行所有操作,并仅授予应用程序用户对这些过程的访问权限。

于 2008-09-03T23:47:12.980 回答
1

假设您使用的是 MS SQL,您可以利用 Windows 身份验证,该身份验证在源代码中的任何位置都不需要用户名/密码。否则我将不得不同意其他推荐 app.config + 加密的海报。

于 2008-09-03T23:59:34.603 回答
0
  1. 创建操作系统用户
  2. 将密码放入该用户的操作系统环境变量中
  3. 以该用户身份运行程序

好处:

  1. 只有 root 或该用户可以查看该用户的 O/S 环境变量
  2. 幸免于重新启动
  3. 您永远不会不小心将密码签入源代码控制
  4. 您无需担心搞砸文件权限
  5. 您无需担心存储加密密钥的位置
  6. 作品x平台
于 2013-12-23T19:20:28.200 回答