关于不可知的语言:如何避免将数据库密码以明文形式存储在源代码中?

关于不可知的语言:如何避免将数据库密码以明文形式存储在源代码中?

How do I avoid having the database password stored in plaintext in sourcecode?

在我正在开发的Web应用程序中,当前连接到数据库时,我使用的是幼稚的解决方案:

1
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,那么如果您使用域帐户来运行应用程序,然后使用与数据库的受信任连接,则所有这些都将变得无关紧要。在这种情况下,连接字符串将不包含任何用户名和密码。


假设您使用的是MS SQL,则可以利用Windows身份验证,该身份验证不需要源代码中的ussername / pass。否则,我将不得不同意其他建议使用app.config +加密的海报。


除非我遗漏了一点,否则连接应该由服务器通过连接池进行管理,因此连接凭据由服务器而不是应用程序保存。

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

同样,也不要给数据库帐户特权高于或高于基本需要的特权。

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


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

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

这是来自CodeProject的有用文章:

  • 对app.config和/或web.config中的ConnectionString进行加密和解密

  • 创建一个O / S用户
  • 将密码放在该用户的O / S环境变量中
  • 以该用户身份运行程序
  • 优点:

  • 只有root或该用户可以查看该用户的O / S环境变量
  • 重启后仍然存在
  • 您绝不会不小心将密码签入源代码管理
  • 您无需担心搞砸文件权限
  • 您无需担心存储加密密钥的位置
  • 适用于x平台

  • 推荐阅读