Вопрос

Для внутреннего приложения Tomcat/Java/Struts мы преобразуем специально написанный код аутентификации для использования JDBCRealm.База данных MySQL 5.0, пароли хранятся как PASSWORD()- зашифрованные строки.В нашей версии MySQL PASSWORD() функция представляет собой нестандартный (собственный?) 41-байтовый хэш.(Теперь я знаю, что нам не следует использовать его для наших паролей, а вместо этого следует использовать SHA1() или MD5().Но мы здесь.)

Есть ли способ использовать JDBMRealm, не заставляя всех наших пользователей повторно вводить свои пароли, чтобы мы могли их перекодировать?Существует ли дайджест JDBCRealm, который позволит нам аутентифицироваться по PASSWORD()столбец с закодированным паролем?

Это было полезно?

Решение

Новые версии MySQL предоставить функцию называется OLD_PASSWORD() который обрабатывает пароль обратно совместимым с версией 4.0 и более ранними версиями.

Таким образом, что вы можете сделать, так это настроить JDBCRealm таким образом, чтобы это:

  1. Сам по себе не использует никаких дайджестов.Очевидно, что это не идеально даже в безопасной среде и совершенно опасно, если ваш сервер базы данных использует ненадежное соединение.Вы делаете это, не указывая digest атрибут.
  2. Использует вышеуказанное OLD_PASSWORD() функция шифрования пароля перед сравнением его с паролем из базы данных.Вам придется расширить JDBCRealm, этот функционал не предусмотрен из коробки.Для Tomcat 6.0 вам придется переопределить authenticate(Connection c, String username, String credentials) метод.

Вы также можете использовать описанный выше подход как часть стратегии миграции:иметь переопределенный метод, поддерживающий как OLD_PASSWORD() и переваривать и заставлять пользователей, прошедших аутентификацию с помощью OLD_PASSWORD() изменить свой пароль.Надеемся, со временем вы сможете перейти на стандартный подход, основанный на дайджестах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top