由于安全性要求,我需要在我的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使用哈希数据库密码?
答案 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