java - 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òêì\Î
我认为加密的消息将是一些字母数字字符串。
我的代码中是否缺少某些内容?
解决方案
当您使用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);
推荐阅读
- r - 添加一个新级别的变量,并为其分配每个 id 的其他变量的平均值
- testing - 边界值分析 - 何时使用二值或三值?
- android - VS2019 - Google Play 控制台错误 - 无法签署应用程序包
- amazon-cloudfront - Lambda@edge 不是由源请求事件触发的
- go - 如何让多个 goroutine 读取单个文件的行?
- node.js - switchmap 2nd http 调用未返回值 - 标头错误
- python - 在 SymPy 中获得最小的变量幂?
- php - queryResults 和其后的多个 if 语句
- jupyter-notebook - WSL 中的 Jupyter 笔记本
- reactjs - 使用 Jest 和 Enzyme 测试使用 Redux 的功能性 React 组件