消息摘要哈希MD5

时间:2013-03-05 08:35:18

标签: java spring spring-security

我正在尝试为字符串"password"获取MD5哈希值。

当我在Spring框架中使用MD5PasswordEncoder类时,我得到了这个:

  

5f4dcc3b5aa765d61d8327deb882cf99

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

  

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();
    }
}

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

你会得到

5f4dcc3b5aa765d61d8327deb882cf99

答案 2 :(得分:0)

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

尝试

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

将字节转换为十六进制。