【问题标题】:How to resolve : Plaintext Storage of a Password如何解决:密码的明文存储
【发布时间】:2013-04-16 09:36:55
【问题描述】:

我已将我的 JAVA EAR 提交给 Veracode 安全工具,并在以下代码中遇到密码明文存储问题:

ApplicationProperties   app = new ApplicationProperties(fileProp);
String sqlServerPassword = app.getAppProperty("sqlServerPassword");  
con = DriverManager.getConnection(sqlServerConnectString, sqlServerUserID, sqlServerPassword);  

我已经在属性文件中存储了这个密码的值。
请有人帮我解决这个问题。

【问题讨论】:

  • 显而易见的答案是“不要以纯文本形式存储密码”,但我猜你的真正问题是,你如何存储它并仍然使用它连接。 (例如,如果您有一个公钥,管理员可以使用它为文件生成密码字符串,然后您使用嵌入在您的应用程序中的私钥对其进行解码,诸如此类......)
  • 是的,这是我的问题。你所说的公钥是什么意思?
  • @user1782009 哇,这里有很多东西要读:en.wikipedia.org/wiki/Public-key_cryptography
  • @Khanserthanks 的链接..但它只包括理论部分..您能否提供任何实际的实现方法来存储我的密码,而不是将其存储为纯文本?

标签: java jdbc security veracode


【解决方案1】:

既然您说您有一个企业应用程序(EAR),那么您将把它部署到一个应用程序服务器上。在企业应用程序中处理数据库连接的正常方式是让服务器将连接池作为资源进行管理。然后,您的应用程序可以使用 JNDI 查找连接池并获取连接。

当您在服务器上配置连接池时,应用程序永远不需要知道其所有托管服务器端的详细信息(例如数据库服务器、用户名或密码)。安全性来自服务器上的内置访问控制机制。

阅读您的应用程序服务器的文档,可能会有具体说明告诉您如何将连接池配置为 JNDI 资源。

【讨论】:

  • 你的意思是这样的... InitialContext itx = new InitialContext();数据源 dts = (DataSource)itx.lookup(url); con = dts.getConnection(hsUserId, sqlServerPassword);但我也需要将此密码存储在某个地方..对吗?
  • @user1782009 - DataSource 也有一个 getConnection() 方法。请参阅tomcat.apache.org/tomcat-6.0-doc/… 了解它如何在 tomcat 上工作的示例。
  • 是的..但是如果我只使用 getConnection() 将如何使用凭据连接到数据库?
  • @user1782009 因为您在服务器上创建数据源时将凭据提供给它。它在内部存储它们。
【解决方案2】:

如果您的应用程序依赖于 SQL 身份验证,则必须在配置文件中保护凭据。使用受保护的配置提供程序对连接字符串进行加密,然后再将它们存储到配置文件中。

看看下面的文章:

http://scribblejava.wordpress.com/2010/03/23/encrypt-username-and-password-for-jndi-in-tomcat-server-xml/

法比奥 @fcerullo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多