SHA1哈希无法在Java中按预期方式工作

时间:2019-01-01 07:25:52

标签: 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òêì\Î

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

我在代码中缺少什么吗?

1 个答案:

答案 0 :(得分:2)

当您使用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);