2009-11-30 15 views
15

私は、ログインのために春のフレームワークと春のセキュリティを使用しているJava Webアプリケーションを持っています。私のデータベースでは、保存する前にパスワードをMD5に暗号化しています。私はこのコードを私のapplication-config.xmlに追加しました春のセキュリティ暗号化MD5

<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> 

最初は、dbのパスワードが暗号化されていないときに機能しました。しかし、私はそれを暗号化し、アプリケーションの設定でこのスニペットを追加しました

 <security:password-encoder hash="md5"/> 

私はログインできません。

+7

md5はハッシュ関数であり、暗号化の方法ではありません。 – u0b34a0f6ae

+1

あなたはどういう意味ですか?私は – cedric

答えて

6

どのように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」を得るのですか?

+0

ああ、行っているはずです。私はmessageDigest.digest()の16を見逃しました。toString(16)。ありがとう – cedric

+0

実際には、31未満のシンボルが存在する可能性があります。そう。これはいくつかの状況では機能しません(非常にまれです)。あなたは32記号を持たない限り "0"を追加する必要があります –

4

あなたはSpringセキュリティリファレンスマニュアルの6.3.3 Hashing and Authenticationセクションを読んでいますか?パスワードハッシュを使用する際に遭遇する可能性があるいくつかの問題について述べました。

それが記載されているいくつかの可能性:

  • データベースのパスワードハッシュがMD5PasswordEncoderからの結果は16進数の文字列
  • している間にあなたのパスワードハッシュがからの結果ながら、大文字であるかもしれない、Base64でであるかもしれませんエンコーダは小文字の文字列です
47

私はこれが少し遅れたことを認識していますが、Springにはこれをもっと簡単にする組み込みのクラスがあります。

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

    assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass); 
} 

この私は春のセキュリティコードで構築されたを使用して書いたユニットテストで、それはするMessageDigestコードよりも多くの小さく、すでに春のセキュリティを使用しているので、あなたはすでにあなたのクラスパス内のクラスを持っている必要があります。

+2

これは最高の答えです。クリーンで春に簡単です。 –

+1

Springアプリケーションでうまく使用する方法の詳細をもう少し詳しくは、[別の回答](http://stackoverflow.com/questions/7378107/hashing-and-salting-passwords-with-spring-security-3) 。 – chrisjleu