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

Language agnostic 如何避免数据库密码以明文形式存储在源代码中?,language-agnostic,passwords,database-connection,Language Agnostic,Passwords,Database Connection,在我正在开发的web应用程序中,我目前在连接数据库时使用了一种简单的解决方案: Connection c = DriverManager.getConnection("url", "username", "password"); 这很不安全。如果攻击者获得了对源代码的访问权,那么他也将获得对数据库本身的访问权。我的web应用程序如何在不将数据库密码以明文形式存储在源代码中的情况下连接到数据库?您可以将连接字符串存储在web.config或App.config文件中,并加密保存它的部分。下面是我

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

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

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

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


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

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


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

      在上面,是


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

      除非我错过了连接应由服务器通过连接池管理的要点,因此连接凭据由服务器持有,而不是由应用程序持有

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

      此外,决不给予db帐户超出基本需要的特权


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

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

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

    • 只有root用户或该用户才能查看该用户的O/s环境变量
    • 重新启动后仍然有效
    • 您从未意外地将密码签入到源代码管理
    • 您不必担心会破坏文件权限
    • 您不必担心加密密钥存储在哪里
    • Works x平台