ログインにSpringFrameworkとSpringSecurityを使用するJava Webアプリケーションがあります。データベースでは、保存する前にパスワードをMD5に暗号化しています。application-config.xmlにこのコードを追加しました。
<security:authentication-provider>
<security:password-encoder hash="md5"/>
<security:jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="select user_name username, user_password password, 1 enabled from users where user_name=?"
authorities-by-username-query="select username, authority from authorities where username=?" />
</security:authentication-provider>
最初は、データベース内のパスワードが暗号化されていない場合に機能しました。しかし、暗号化してこのスニペットをアプリケーション構成に追加したとき
<security:password-encoder hash="md5"/>
ログインできません。
MD5ハッシュをどのように作成していますか?次のようなものはJavaでうまく機能します:
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(user.getPassword().getBytes(),0, user.getPassword().length());
String hashedPass = new BigInteger(1,messageDigest.digest()).toString(16);
if (hashedPass.length() < 32) {
hashedPass = "0" + hashedPass;
}
「コアラ」をエンコードすると、「a564de63c2d0da68cf47586ee05984d7」が表示されますか?
これは少し遅いと思いますが、Springにはこれをはるかに簡単にする組み込みクラスがあります。
@Test
public void testSpringEncoder() {
PasswordEncoder encoder = new Md5PasswordEncoder();
String hashedPass = encoder.encodePassword("koala", null);
assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass);
}
これは、組み込みのSpring Securityコードを使用して作成した単体テストです。MessageDigestコードよりもはるかに小さく、Spring Securityを既に使用しているため、クラスパスにクラスが既に含まれている必要があります。
Spring Securityリファレンスマニュアルの 6.3.3ハッシュと認証 セクションを読みましたか?パスワードハッシュを使用する際に発生する可能性のあるいくつかの問題について説明しました。
それがリストしたいくつかの可能性: