gpt4 book ai didi

java - 从 hibernate 状态使用 MySql PASSWORD() 函数

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:48 24 4
gpt4 key购买 nike

我正在使用 PrimeFaces 将旧的 java 桌面 swing 应用程序重写为 JSF 应用程序。

旧应用程序没有使用 hibernate ,但我决定在新应用程序中使用它。一切正常,但问题是当我想使用 MySql 的函数 password() 保存 hibernate 密码时。

有没有办法做到这一点,因为如果我可以在不更改密码的情况下将数据从旧数据库导入到新数据库,那就太好了。

我设法使用此代码片段登录:

public User login(String username, String password) {

User result = null;

Session session = HibernateUtil.getSessionFactory().openSession();
try {
String sql = "select s from User where username=:username and password=password(:password)";
Query query = session.createQuery(sql);
query.setString("username", username);
query.setString("password", password);

result = (User) query.uniqueResult();

if (result != null) {
Hibernate.initialize(result.getUserData());
}
}
finally {
session.close();
}

return result;
}

但这里是新用户注册的问题,因为我不知道如何存储密码。我用来将用户保存到数据库的代码如下所示:

public User addUser(User obj) {
Session session = HibernateUtil.getSessionFactory().openSession();

try {
session.save(obj);
session.flush();
}
finally {
session.close();
}
return obj;
}

我知道我可以用老式的方式编写整个插入语句,但是使用 hibernate 有什么意义,代码看起来会很丑陋。另外,我对登录片段也不满意。我也尝试在插入后使用触发器更新密码,但我一直收到错误消息:

Updating of NEW row is not allowed in after trigger

所以我放弃了这种方法,因为它很丑而且行不通。

我应该只使用 jasypt 吗?或任何其他库来加密应用程序中的密码并完成它?或者我的问题有一个优雅的解决方案。

最佳答案

MySql 函数password()根本不应该用于散列密码!来自文档:

The PASSWORD() function is used by the authentication system in MySQL Server; you should not use it in your own applications.

计算速度快且未加盐,这使得它非常不安全。相反,将散列留给服务器端语言并使用一个库,该库使用具有成本因素的慢散列函数,如 BCrypt、PBKDF2 或 SCrypt。一个著名的 Java 库是 jBCrypt .

关于java - 从 hibernate 状态使用 MySql PASSWORD() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28003983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com