Дайджест JDBCRealm для функции MySQL PASSWORD()

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

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


person Plutor    schedule 07.08.2009    source источник


Ответы (1)


Новые версии 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(), изменить свой пароль. Надеюсь, со временем вы сможете переключиться на стандартный подход, основанный на дайджестах.

person ChssPly76    schedule 07.08.2009
comment
Я отметил это как решение для других людей, но мы решили поступить правильно и исправить все наши пароли в кодировке MD5, даже если это будет раздражать наших пользователей. - person Plutor; 11.08.2009
comment
Я могу вам только позавидовать - я не мог позволить себе раздражать своих пользователей :-) - person ChssPly76; 11.08.2009