JDBCRealm дайджест для функции MySQL PASSWORD () - PullRequest
0 голосов
/ 07 августа 2009

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

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

1 Ответ

1 голос
/ 07 августа 2009

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

...