Использование функции MySql PASSWORD() из спящего режима

Я переписываю старое приложение Java для настольных компьютеров в приложение JSF, используя PrimeFaces.

Старое приложение не использовало спящий режим, но я решил использовать его в новом приложении. Все работает нормально, но проблема в том, что я хочу сохранить пароли в спящем режиме, используя функцию 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;
}

Я знаю, что мог бы написать весь оператор вставки по старинке, но какой смысл тогда использовать спящий режим, а то код будет выглядеть уродливо. Также меня не устраивает фрагмент входа в систему. Я также пытался обновить пароль с помощью триггера после вставки, но постоянно получал ошибку:

Updating of NEW row is not allowed in after trigger

Поэтому я отказался от этого подхода, так как он уродлив и не работает.

Должен ли я просто использовать jasypt или любую другую библиотеку для шифрования паролей в приложениях и покончить с этим? Или есть элегантное решение моей проблемы.


person Kiki    schedule 17.01.2015    source источник


Ответы (2)


Использование Jasypt EncryptedStringType намного удобнее, так как вы делегируете хэширование пароля UserType.

Таким образом, логика вашего приложения не должна иметь дело с обязанностями, связанными с паролями (например, в случае вашего SELECT с использованием непереносимой функции PASSWORD SQL).

UserType также позаботится о хешировании фактического пароля для INSERT/UPDATE.

Итак, Jasypt — гораздо лучшая альтернатива.

person Vlad Mihalcea    schedule 17.01.2015
comment
Может я что-то упустил, но разве библиотека Jasypt не предназначена для шифрования? Я не смог найти никаких хеш-функций, а пароли пользователей, безусловно, должны быть хешированы, а не зашифрованы. - person martinstoeckli; 19.01.2015
comment
Шифрование может быть односторонним (хеширование) или двусторонним (закрытый и открытый ключи). Хеширование можно выполнять с помощью MD5, SHA-1 или SHA-2, и Jasypt их поддерживает. - person Vlad Mihalcea; 20.01.2015
comment
Хорошо, наконец я нашел страницу, которую искал, и кажется, что односторонние хэши действительно поддерживаются , также есть пример кода. Обычно различают шифрование (двустороннее) и хэширование (одностороннее). - person martinstoeckli; 20.01.2015
comment
В колледже я изучил этот материал на курсе «Теория связи, кодирование и шифрование». Теория хэширования — это раздел шифрования. - person Vlad Mihalcea; 20.01.2015

Функция MySql password() не должна быть используется вообще для хеширования паролей! Из документации:

Функция PASSWORD() используется системой аутентификации в MySQL Server; вы не должны использовать его в своих собственных приложениях.

Расчет выполняется быстро и без соли, что делает его очень небезопасным. Вместо этого оставьте хэширование серверному языку и используйте библиотеку, которая использует медленную хеш-функцию с коэффициентом стоимости, например BCrypt, PBKDF2 или SCrypt. Хорошо известной библиотекой для Java является jBCrypt.

person martinstoeckli    schedule 19.01.2015