首页 > 解决方案 > SHA1 哈希在 Java 中无法按预期工作

问题描述

我正在尝试编写一个小的 Java 代码来查看如何正确使用 SHA1。

以下是我想出的代码片段:

package dummyJavaExp;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Exp1 {

    public static void main(String[] args) throws NoSuchAlgorithmException {
        // TODO Auto-generated method stub
        String str = "Hello there";
        String hashstr = new String(MessageDigest.getInstance("SHA1").digest(str.getBytes()));
        System.out.println("Encrypted value of " + str + " is: " + hashstr);
    }

}

但是当我运行上面的代码时,上面的代码给出了一些奇怪的字符,如下面的输出消息所示:

Encrypted value of Hello there is: rlvU>?Þ¢‘4ónjòêì\Î

我认为加密的消息将是一些字母数字字符串。

我的代码中是否缺少某些内容?

标签: java

解决方案


当您使用String sample = new String(byte[] bytes)它时,它将使用平台的默认字符集创建一个字符串,您的摘要字节在该字符集中可能没有字母数字表示。

尝试使用 Base64 或 HexString 来显示摘要消息。

例如在 JAVA8 中:

您可以使用以下命令将摘要字节编码为字符串:

String hashstr = Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA1").digest(str.getBytes("UTF-8")));

您可以使用以下方法解码 Base64:

byte [] digest = Base64.getDecoder().decode(hashstr); 

推荐阅读