我正在尝试为字符串"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();
}
}
答案 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)));
将字节转换为十六进制。