SHA1哈希在Java中未按预期工作

SHA1哈希在Java中未按预期工作,java,Java,我正在尝试编写一个小Java代码,看看如何正确使用SHA1 以下是我想到的代码片段: package dummyJavaExp; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Exp1 { public static void main(String[] args) throws NoSuchAlgorithmException {

我正在尝试编写一个小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òêì\Î
我以为加密的信息是字母数字字符串


我的代码中缺少什么吗?

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

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

加密的消息是字节数组,也许您需要base64ok,那么如何获取字母数字字符串呢。我想使用生成的哈希作为哈希映射中的键。我不能用字节作为键。这取决于你的紫色。如果需要加密值,则必须使用MessageDigest;一旦获得加密的字节数组,您可以考虑创建base64字符串。如果您只需要base64字符串,那么您可以直接从原始string1创建它。不要使用String.getBytes(),它使用您的平台默认编码。使用String.getBytes(StandardCharsets.UTF_8),它使用UTF_8,因此保证在任何地方都以相同的方式工作并支持任何字符。2.使用Base64或十六进制编码对结果进行编码。一些纯粹的注释:结果是哈希值,而不是加密值。后者不知何故建议您可以解密它。加密的消息是字节数组,可能您需要base64ok,那么如何获得字母数字字符串。我想使用生成的哈希作为哈希映射中的键。我不能用字节作为键。这取决于你的紫色。如果需要加密值,则必须使用MessageDigest;一旦获得加密的字节数组,您可以考虑创建base64字符串。如果您只需要base64字符串,那么您可以直接从原始string1创建它。不要使用String.getBytes(),它使用您的平台默认编码。使用String.getBytes(StandardCharsets.UTF_8),它使用UTF_8,因此保证在任何地方都以相同的方式工作并支持任何字符。2.使用Base64或十六进制编码对结果进行编码。一些纯粹的注释:结果是哈希值,而不是加密值。后者不知何故暗示你可以解密它。