使用休眠中的 MySql PASSWORD() 函数

Using MySql PASSWORD() function from hibernate

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

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

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

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

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 或任何其他库来加密应用程序中的密码并完成它吗?或者有什么优雅的解决方案可以解决我的问题。

使用 Jasypt EncryptedStringType 更方便,因为您将密码散列委托给 UserType。

这样您的应用程序逻辑就不必处理与密码相关的责任(就像您的 SELECT 使用不可移植的 PASSWORD SQL 函数的情况一样)。

UserType 还将负责散列 INSERT/UPDATE 的实际密码。

因此,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