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

我正在创建一个应用程序,我需要连接到数据库。数据库需要登录名/密码,以便应用程序可以执行选择和插入等操作。

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

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

.

.

注意:连接由应用程序建立。无需人工输入即可进行连接。

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


答案 1

通常的方法是将用户名/密码外部化到运行时读取的属性/配置文件(无论您是否使用本机 JDBC/JNDI/CDI/J2EE 数据源/等)。

该文件由系统管理员通过操作系统安全性进行保护。

操作系统具有比应用代码更好的保护工具。


答案 2

您可以使用 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;
    }
}