java - 哈希对相同的输入返回不同的结果
问题描述
MessageDigest
即使连续使用相同的字符串 3 次,我也无法输出相同的哈希值。我已将代码简化为基础,并且这种行为仍然存在。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;
public class foo {
private static byte[] hashPass(String _pass) {
MessageDigest mDigest;
try {
mDigest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
System.out.println("[" + e.getMessage() + "] Unable to create message digest");
return null;
}
try {
return mDigest.digest( _pass.getBytes("UTF-8") );
} catch (UnsupportedEncodingException e) {
System.out.println("[" + e.getMessage() + "]");
return null;
}
} //private boolean hashPass(...)
public static void main(String[] args) {
System.out.println("Hash1: " + hashPass("string"));
System.out.println("Hash2: " + hashPass("string"));
System.out.println("Hash3: " + hashPass("string"));
}
}
//Outputs:
//Hash1: [B@7852e922
//Hash2: [B@4e25154f
//Hash3: [B@70dea4e
奇怪的是它在每次重新运行时输出相同的输出 - 这意味着内部状态每次都以相同的方式变化?它是否使用盐或其他我不知道并且应该指定/使用的输入?
解决方案
hashPass()
方法返回一个byte[]
数组,在 java 中数组没有有意义的toString()
表示。要显示数组的元素,请使用Arrays.toString()
:
System.out.println(Arrays.toString(hashPass("string")));
这将打印:
[71, 50, -121, -8, 41, -115, -70, 113, 99, -88, -105, -112, -119, 88, -9, -64, -22, -25, 51, -30, 93, 46, 2, 121, -110, -22, 46, -36, -101, -19, 47, -88]
或将byte[]
数组转换为十六进制表示:
byte[] bytes = hashPass("string");
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
System.out.println(sb);
这将打印:
473287F8298DBA7163A897908958F7C0EAE733E25D2E027992EA2EDC9BED2FA8
推荐阅读
- oracle - 使用来自 ldap oracle apex 的值创建列表
- omnet++ - 如何在静脉 RSU 示例中包含流量记录
- android - 在需要更改密码的代理下使用 Android Studio
- swift - 在Swift中没有嵌套if-else的情况下将值添加到N维字典中的方法?
- c# - 使用 Nest 按多个字段分组
- sql - 计算 spark.sql 数据库列中包含的列表中特定元素的最长序列
- excel - 查找嵌套重复项
- excel - 需要帮助从“是”和“否”矩阵创建将行转换为工作表的宏
- python - 如果基于条件 python pandas 从其他表中丢失数据,则更新行
- python - 使用 cdk 获取两个分支 (codecommit) 之间的所有 CommitId