散列数据库密码[休眠]

时间:2016-08-19 12:03:07

标签: java hibernate password-encryption

由于安全性要求,我需要在我的hibernate.cfg.xml中将数据库密码存储为md5-hash,但据我所知,Hibernate不支持散列密码。我正在使用hibernate 5.1.0。

我的hibernate.cfg.xml如下所示:

    <?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">org.h2.Driver </property>
    <property name="hibernate.connection.url">jdbc:h2:tcp://localhost/~/test</property>
    <property name="hibernate.connection.username">sa</property>
    <property name="hibernate.connection.password"></property>
      <property name="show_sql">true</property>
  <property name="hibernate.c3p0.min_size">5</property>
  <property name="hibernate.c3p0.max_size">20</property>
  <property name="hibernate.c3p0.timeout">300</property>
  <property name="hibernate.c3p0.max_statements">50</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.hbm2ddl.auto">update</property>

</session-factory>
</hibernate-configuration>

这是我创建sessionFactory的方法:

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtility {
    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration()
                    .configure()
                    .buildSessionFactory().;
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

有没有办法为hibernate使用哈希数据库密码?

2 个答案:

答案 0 :(得分:4)

hibernate使用hibernate.connection.password中提供的密码连接数据库,因此需要实际密码而不是哈希密码。

只有当您需要验证用户的身份时才存储散列密码,因为一旦任何文本被哈希,它是不可逆转的

这是一个单向过程: 您可以从密码中获取散列文本,但无法从生成的散列文本中获取密码。

如果您在hibernate.connection.password中存储散列密码,那么您的hibernate将无法连接到数据库,因为无法从MD5哈希获取密码。所以这是不可能的。

另见:Fundamental difference between Hashing and Encryption algorithms

但是,您可以在hibernate.cfg.xml中加密密码,请参阅this question

答案 1 :(得分:0)

您最好将密码外部化,即从hibernate.cfg.xml中完全删除它。然后,您可以通过系统属性传递它,例如将以下内容添加到服务器的启动命令-Dhibernate.connection.password = password。

更好的方法是在app服务器中定义JNDI数据源,然后让hibernate获取对此的引用。然后从应用程序配置中删除所有数据库凭据,然后您可以将应用程序部署到不同的环境而不更改配置(假设JNDI数据源名称保持一致)。

请参阅:

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html