java - SHA1 Java 与 Python 不一样
问题描述
我需要将一段 python 翻译成 Java,但是当我做一个 SHA 哈希时,我没有像 Python 一样的结果,有字符串:
$&).6CXzPHw=2N_+isZK2908069825
// Java 代码
private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException {
MessageDigest msdDigest = MessageDigest.getInstance("SHA-1");
msdDigest.reset();
msdDigest.update(input, 0, input.length);
System.out.println(DatatypeConverter.printHexBinary((msdDigest.digest())));
return msdDigest.digest();
}
// Python代码
print(sha1(prefix + str(num4).encode('ascii')).digest())
也许字节类型之间有区别??有任何想法吗 ?谢谢
解决方案
Erwin Bolwidt 在评论中回答了问题:
删除
digest
是破坏性的,你调用它两次 - 你从方法返回的值不正确
在此之上:
无需调用
reset()
新的MessageDigest
结合起来,以上所有意味着您的代码应该是:
private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException {
return MessageDigest.getInstance("SHA-1").digest(input);
}
测试
byte[] input = "$&).6CXzPHw=2N_+isZK2908069825".getBytes("US-ASCII");
System.out.println(Arrays.toString(getSHA1(input)));
输出
[-96, -1, 78, 94, -67, -96, -113, 12, -31, 93, -10, -55, -5, 72, -2, -57, 52, -84, -117, 40]
这与Python output相同,除了打印为有符号字节和无符号字节:
[160, 255, 78, 94, 189, 160, 143, 12, 225, 93, 246, 201, 251, 72, 254, 199, 52, 172, 139, 40]
推荐阅读
- python - 在 For 循环中使用 If 创建 lambda 函数
- sql - 如何为 SQLCMD 使用 Windows 用户?
- apache-spark - spark UDAF on range based window - 如何从正在计算聚合的 UDAF 初始化/更新中获取原始行的列值
- sql - 根据子表中的多个列组合选择父行
- python - 停止焦点陷入 QTableView
- python - TypeError:“int”类型的对象在 python 中没有 len()
- keyboard-shortcuts - 如何在 Spyder (Python IDE) 中创建快捷键?
- python - 是否可以自定义散点图中的每个正方形?
- flutter - 如何设置gridview的孩子的宽度以匹配屏幕宽度?
- crash - Outlook 中的 VBA 项目间歇性崩溃