如何在不泄露密码的情况下连接到需要密码的数据库?

时间:2012-06-19 01:02:18

标签: java database security cryptography password-protection

我正在创建一个应用程序,我需要连接到数据库。数据库需要登录/密码,因此应用程序可以执行select和insert等操作。

在应用程序中,我需要使用登录名和密码连接到数据库,因此应用程序可以自由地在数据库上执行某些任务。 我的问题是:如何在不泄露密码的情况下存储和使用密码连接到数据库?

我不能简单地使用哈希或加密来存储密码,因为数据库必须识别密码(我认为大多数或所有数据库必须以纯文本形式接收密码)。

注意:连接由应用程序进行。没有人工输入来进行连接。

(编辑)有关应用程序的更多信息:它是一个使用servlets / jsp的Web应用程序。数据库位于应用程序的同一服务器上。该应用程序的用户是没有完全管理员权限的默认用户,但它可以插入/删除行并执行涉及表中查询和数据修改的大多数事情。

4 个答案:

答案 0 :(得分:10)

通常的做法是将用户名/密码外部化为在运行时读取的property/config file(无论您是否使用本机JDBC / JNDI / CDI / J2EE数据源/等)。

sysadmins通过O / S安全保护文件。

O / S具有比应用程序代码更好的保护工具。

答案 1 :(得分:7)

您应该使用配置文件。使用带JDBC的spring,让您的生活更轻松!

http://www.youtube.com/watch?v=f-k823MZ02Q

查看关于Spring框架的上述精彩教程并使用JDBC。观看他所有的JDBC和spring教程。 顺便说一句,他介绍了如何在配置文件和线程bean等中存储密码。希望这会有所帮助。

答案 2 :(得分:6)

您可以使用jasypt进行加密。并将用户名和密码存储到datasource.properties文件中。

public Connection getConnection() throws IOException{
    try{
        BasicTextEncryptor encryptor = new BasicTextEncryptor();
        encryptor.setPassword("jasypt");

        Properties props = new EncryptableProperties(encryptor);
        props.load( this.getClass().getResourceAsStream("datasource.properties") );

        String driver = props.getProperty("datasource.driver");
        String url = props.getProperty("datasource.url");        
        String userName = props.getProperty("datasource.userName");          
        String password = props.getProperty("datasource.password");

        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, userName, password);
        conn.setAutoCommit(false);

        return conn;
    } catch(ClassNotFoundException e) {
        e.printStackTrace();
        return null;

    } catch(SQLException e) {
        e.printStackTrace();
        return null;
    }
}

答案 3 :(得分:5)

如果是Web应用程序,请将其部署在Java EE应用程序服务器上并使用JNDI资源进行连接。只有设置JNDI数据资源的管理员才需要知道连接所需的凭据。用户和开发人员甚至不必了解它们;只是JNDI查找名称。

除了数据库所有者之外,不可能完全消除对知道用户名和密码的需求,但可以将该知识限制在应用服务器所有者。

建议您仅为该应用程序创建单独的凭据,并授予其完成任务所需的最低访问权限和权限。应该不了解系统表或应用程序省外的任何其他资源。如果不需要DELETE权限,请不要授予它。如果只能读取访问权限,那么您应该获得该凭证的权限。