16

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

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

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

.

.

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

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

4

4 回答 4

10

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

该文件由系统管理员通过 O/S 安全性保护。

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

于 2012-06-19T01:05:24.927 回答
7

您可以使用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;
    }
}
于 2012-06-19T01:17:23.353 回答
7

您应该为此使用配置文件。将 spring 与 JDBC 结合使用,让您的生活更轻松!

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

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

于 2012-06-19T02:13:45.373 回答
5

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

不可能完全消除除数据库所有者之外的其他人知道用户名和密码的需要,但可以将这些知识限制为应用服务器所有者。

还建议您仅为该应用程序创建单独的凭据,并为其授予完成其任务所需的最低访问权限和权限。不应该了解系统表或应用程序范围之外的任何其他资源。如果不需要删除权限,请不要授予它。如果访问权限只能是只读的,那么这就是您应该授予该凭据的权限。

于 2012-06-19T01:04:27.480 回答