如何避免在源代码中以明文形式存储数据库密码?

时间:2008-09-03 23:30:48

标签: language-agnostic passwords database-connection

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

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

这非常不安全。如果攻击者获得对源代码的访问权限,他也可以访问数据库本身。我的Web应用程序如何连接到数据库而不用源代码中的明文数据库密码?

6 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:5)

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

其中,config file can be encrypted

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

答案 2 :(得分:1)

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

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

以下是CodeProject的有用文章:

答案 3 :(得分:1)

除非我忽略了连接应该由服务器通过连接池管理,因此连接凭据由服务器而不是应用程序保存。

更进一步,我通常构建一个约定,其中前端Web应用程序(在DMZ中)仅通过Web服务(在域中)与DB进行通信,因此提供完全分离和增强的数据库安全性。

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

  1. 创建操作系统用户
  2. 将密码放在该用户的O / S环境变量中
  3. 以该用户身份运行程序
  4. 优点:

    1. 只有root用户或该用户才能查看该用户的O / S环境变量
    2. 生存重启
    3. 您永远不会意外地将密码检入源代码管理
    4. 您无需担心搞砸文件权限
    5. 您无需担心存储加密密钥的位置
    6. Works x-platform