如何在java中使用MessageDigest类?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在java中使用MessageDigest类?相关的知识,希望对你有一定的参考价值。

在检查了这个问题(How can I generate an MD5 hash?)并阅读MessageDigest文档后,我试图散列一个简单的字符串。但由于某种原因,我传入方法的每个字符串都返回相同的值。下面显示了我写的代码。

    byte[] bytesOfMessage = "helloworld".getBytes("UTF-8");
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] thedigest = md.digest(bytesOfMessage);
    System.out.println(thedigest);

无论如何要限制我从哈希中获得的字符数?

答案

System.out.println(thedigest);调用你的数组的toString()方法。

Java数组类型不会覆盖Object#toString()的默认实现:

// from Object.java
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

这就是为什么你看到字符串[B@5b1d2887

如果要打印数组,请使用java实用程序类java.util.Arrays

System.out.println(Arrays.toString(myArray));

但在您的情况下,您应该从MD5摘要字节数组创建一个人类可读的字符串。使用这个简单的方法:

public static String digestToReadableString(byte[] digest){
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < digest.length; i++) {
        String s = Integer.toHexString(digest[i]);
        while (s.length() < 2) {
            s = "0" + s;
        }
        s = s.substring(s.length() - 2); // we need the last 2 chars
        sb.append(s);
    }
    return sb.toString();
}

或者这一个:https://stackoverflow.com/a/304275/1614378

以上是关于如何在java中使用MessageDigest类?的主要内容,如果未能解决你的问题,请参考以下文章

Java 自带的加密类MessageDigest类(加密MD5和SHA)

Java 自带的加密类MessageDigest(加密MD5和SHA)

shiro中MessageDigest根据盐值计算md5

Java利用MessageDigest进行MD5加密

在 cd1 中使用 SHA512Digest,就像在 java 中使用 MessageDigest

java之MD5加密