如何避免在源代码中以明文形式存储数据库密码? Connection c = DriverManager.getConnection("url", "username", "password");
Connection c = DriverManager.getConnection("url", "username", "password");
这是非常不安全的:
在我开发web应用连接到数据库时我目前使用的是天真的解决方案。如果攻击者获得访问源代码,他也可以访问数据库本身。我的Web应用程序如何连接到数据库,而不需要在源代码中以纯文本形式存储数据库密码?如何避免在源代码中以明文形式存储数据库密码?</p> <pre><code>Connection c = DriverManager.getConnection("url", "username", "password"); </code></pre> <p>这是非常不安全的:
您可以将连接字符串存储在Web.config或App.config文件中,并对保存它的节进行加密。下面是我在以前的项目中使用的连接字符串加密一篇很好的文章:
http://www.ondotnet.com/pub/a/dotnet/2005/02/15/encryptingconnstring.html
我可以建议这些技术用于.NET程序员:
- 加密密码\连接字符串中的配置文件
- 建立信任的客户端和服务器(即使用Windows身份验证等)
这里的连接从CodeProject是有用的文章:
在.NET中,惯例是存储的ConnectionStrings在一个单独的配置文件。
其中,config file can be encrypted。
如果您使用Microsoft SQL Server,如果您使用域帐户运行应用程序,然后使用到数据库的可信连接,则这一切都变得无关紧要。在这种情况下,connectionstring将不包含任何用户名和密码。
除非我错过了连接点应该由服务器通过连接池进行管理,因此连接凭证由服务器保存,而不是由应用程序保存。
采取这种进一步我一般建立到一个惯例,其中前端web应用程序(在DMZ)仅经由web服务会谈到DB(在域),因此提供完全的分离和增强的安全DB。
另外,绝对不要给数据库帐户超过或超过基本需要的特权。
另一种方法是通过存储过程执行所有操作,并授予应用程序用户只能访问这些特效。
假设您正在使用MS SQL,您可以利用Windows身份验证,它不需要ussername /在源代码中的任何位置传递。否则,我将不得不同意其他海报推荐app.config +加密。
- 创建的O/S的用户
- 把密码中的O/S的环境变量针对该用户
- 运行程序作为该用户
优点:
- 只有root用户或该用户可以查看该用户的操作系统环境变量
- 重新启动
- 你永远不小心中源控制检查密码
- 您不必担心搞砸了文件权限
- 您不必担心您存储的加密密钥
- 作品X-平台