0

我正在尝试获取字符串的 MD5 哈希"password"

当我使用MD5PasswordEncoderSpring 框架中的类时,我得到了这个:

5f4dcc3b5aa765d61d8327deb882cf99

但是当我使用MessageDigest带有 MD5 的 Java 类时,我得到了这个:

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

第一个是十六进制,另一个是十进制。为什么有区别?这是代码:

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

问题在于将 Java MessageDigest 的输出转换为字符串的方式。

尝试

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

将字节转换为十六进制。

于 2013-03-05T08:50:30.330 回答