Java 如何连接到需要密码的数据库而不公开密码?

Java 如何连接到需要密码的数据库而不公开密码?,java,database,security,cryptography,password-protection,Java,Database,Security,Cryptography,Password Protection,我正在创建一个应用程序,需要连接到数据库。数据库需要登录/密码,因此应用程序可以执行选择和插入等操作 在应用程序中,我需要使用登录名和密码连接到数据库,这样应用程序就可以自由地在数据库上执行一些任务我的问题是:如何存储和使用密码连接到数据库而不公开密码? 我不能简单地使用散列或加密来存储密码,因为数据库必须识别密码(我认为大多数或所有数据库必须以明文形式接收密码) 注意:连接由应用程序进行。没有人为输入来进行连接 (编辑)关于应用程序的更多信息:它是一个使用servlet/jsp的web应用

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

在应用程序中,我需要使用登录名和密码连接到数据库,这样应用程序就可以自由地在数据库上执行一些任务我的问题是:如何存储和使用密码连接到数据库而不公开密码?

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


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


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

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

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


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

通常的做法是将用户名/密码外部化到一个在运行时读取的凭据(无论您是否使用本机JDBC/JNDI/CDI/J2EE数据源/etc)

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

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

您可以使用它进行加密。并将用户名和密码存储到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;
    }
}

您应该为此使用配置文件。使用spring和JDBC使您的生活更轻松

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

在应用程序启动时,您能提示操作员输入密码吗?连接是由应用程序建立的。无需人工输入。我认为您需要更多地描述一下应用程序的环境。这是一个服务器应用程序,客户端应用程序,数据库在同一台服务器上,不同的服务器上吗?您是否创建了仅具有插入权限的用户?(您没有尝试以root用户身份登录,是吗?)通常,您必须“提供一些信息”,并将登录访问限制在ip范围内。如何访问此文件?是加密的吗?你必须解密密码吗?如何将密码传递到数据库连接?不确定在客户端应用程序(密码在线路上)中如何安全?注意elborate…如果您想防止在编辑配置文件时有人越过您的肩膀查看密码,可以使用Java Helper库中的。这真的很简单,但确实有效地防止人们在你的密码上浏览…@tecnotron文件是纯文本的。我在大型商业网站和服务器上看到过很多次。文件是安全的,因为系统管理员不让任何人靠近文件系统,所以纯文本是安全的(而且容易得多)。你可以随意加密,但只要有足够的时间和CPU,任何东西都可以破解,因此如果人们有权访问该文件,那么它就不“安全”。您需要阻止除sysadmin和正在运行的java进程之外的其他人访问该文件。@Bohemian-您如何允许多个用户同时访问该属性文件?很高兴了解jasypt库。您知道加密/解密过程是否安全吗?我会首先将我需要的所有加密密码存储在一个文件中,然后尝试解密密码(解密是个问题,因为我想我需要另一个密码…)。但似乎你不需要用这个库解密任何东西。Jasypt提供了单向和双向加密技术。我刚刚使用了连接字符串的库。这些是一系列很棒的教程,但是链接的一个没有介绍密码处理。