0

文字列のMD5ハッシュを取得しようとしています"password"

MD5PasswordEncoderSpringフレームワークのクラスを使用していると、次のようになります。

5f4dcc3b5aa765d61d8327deb882cf99

しかし、MessageDigestMD5でJavaのクラスを使用していると、次のようになります。

9577-525990-89101-4229-12539-34-72-126-49-103

1つは16進数で、もう1つは10進数です。なぜ違いがあるのですか?コードは次のとおりです。

public static void main(String[] args)  {
    PasswordEncoder pEncoder = new Md5PasswordEncoder(); 
    System.out.println(pEncoder.encodePassword("password", null));

    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update("password".getBytes("UTF-8"));
        byte [] digest = md.digest();
        StringBuffer sb = new StringBuffer();
        for (byte b : digest) {
            sb.append(b);
        }
        System.out.println(sb.toString());

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
4

3 に答える 3

4

問題は印刷機能です。次のコードは、Springアプリケーションと同じ値を出力します。

public static void main(String[] args) {

  try {
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update("password".getBytes("UTF-8"));
    byte[] digest = md.digest();
    System.out.println(DatatypeConverter.printHexBinary(digest));

  } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
  } catch (UnsupportedEncodingException e) {   
    e.printStackTrace();
  }
}

プリント:

5F4DCC3B5AA765D61D8327DEB882CF99

于 2013-03-05T08:40:42.293 に答える
1

試す

    for (byte b : digest) {
        sb.append(String.format("%02x", b));
    }

あなたが得るでしょう

5f4dcc3b5aa765d61d8327deb882cf99
于 2013-03-05T08:47:25.163 に答える
0

問題は、JavaMessageDigestからの出力が文字列に変換される方法に関係しています。

試す

System.out.print(new String(org.springframework.security.crypto.codec.Hex.encode(digest)));

バイトを16進数に変換します。

于 2013-03-05T08:50:30.330 に答える