MySQL PASSWORD() 関数の JDBCRealm ダイジェスト
質問
内部 Tomcat/Java/Struts アプリケーションの場合、JDBCRealm を使用するようにカスタム作成された認証コードを変換しています。データベースは MySQL 5.0 で、パスワードは次のように保存されます。 PASSWORD()
-暗号化された文字列。私たちのバージョンの MySQL では、 PASSWORD()
関数 は非標準 (独自の?) 41 バイトのハッシュです。(パスワードにこれを使用すべきではなく、代わりに使用すべきであることがわかりました。 SHA1()
または MD5()
. 。しかし、ここにいます。)
パスワードを再エンコードできるように、すべてのユーザーにパスワードの再入力を強制せずに JDBMRealm を使用する方法はありますか?に対する認証を可能にする JDBCRealm ダイジェストはありますか? PASSWORD()
-エンコードされたパスワード列?
解決
新しい MySQL バージョン 機能を提供する 呼ばれた OLD_PASSWORD()
4.0 以前との下位互換性のある方法でパスワードをダイジェストします。
したがって、あなたにできることは、 JDBCRealm を構成する 次のような方法で:
- いかなる種類のダイジェストも単独では使用しません。これは安全な環境であっても明らかに理想的ではなく、データベース サーバーが信頼できない接続を介して存在する場合はまったく危険です。これを行うには、指定しないでください
digest
属性。 - 上記を使用します
OLD_PASSWORD()
データベースのパスワードと比較する前にパスワードを暗号化する機能。JDBCRealm を拡張する必要がありますが、この機能はそのままでは提供されません。Tomcat 6.0 の場合はオーバーライドする必要がありますauthenticate(Connection c, String username, String credentials)
方法。
上記のアプローチを移行戦略の一部として使用することもできます。オーバーライドされたメソッドが両方をサポートするようにします。 OLD_PASSWORD()
を使用して認証したユーザーをダイジェストして強制します OLD_PASSWORD()
パスワードを変更します。時間が経てば、標準的なダイジェストベースのアプローチに切り替えられるようになるでしょう。
所属していません StackOverflow