web-dev-qa-db-ja.com

Spring Security Encrypt MD5

ログインに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"/>

ログインできません。

16
cedric

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」が表示されますか?

6
labratmatt

これは少し遅いと思いますが、Springにはこれをはるかに簡単にする組み込みクラスがあります。

@Test
public void testSpringEncoder() {
    PasswordEncoder encoder = new Md5PasswordEncoder();
    String hashedPass = encoder.encodePassword("koala", null);

    assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass);
}

これは、組み込みのSpring Securityコードを使用して作成した単体テストです。MessageDigestコードよりもはるかに小さく、Spring Securityを既に使用しているため、クラスパスにクラスが既に含まれている必要があります。

47
bh5k

Spring Securityリファレンスマニュアルの 6.3.3ハッシュと認証 セクションを読みましたか?パスワードハッシュを使用する際に発生する可能性のあるいくつかの問題について説明しました。

それがリストしたいくつかの可能性:

  • データベースのパスワードハッシュはBase64にある可能性がありますが、MD5PasswordEncoderの結果は16進文字列になります
  • パスワードハッシュは大文字である可能性がありますが、エンコーダーからの結果は小文字の文字列です
5
DJ.