SHA1 Java和Python是不一样的
我需要将一段python翻译成Java,但是当我进行SHA哈希时,我得到的结果与python不同,有一个字符串:SHA1 Java和Python是不一样的,java,python,cryptography,sha1,Java,Python,Cryptography,Sha1,我需要将一段python翻译成Java,但是当我进行SHA哈希时,我得到的结果与python不同,有一个字符串: $&).6CXzPHw=2N_+isZK2908069825 //Java代码 private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException { MessageDigest msdDigest = MessageDigest.getInstance("SHA-1");
$&).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())
可能是字节类型之间的差异??
有什么想法吗?
谢谢问题由埃尔文·博维特在a中回答: 删除
print
语句。调用digest
是破坏性的,您调用它两次-从方法返回的值不正确
除此之外:
- 没有必要去拜访一位新的律师
- 打电话代替
- 调用而不是+
private static byte[] getSHA1(byte[] input) throws NoSuchAlgorithmException {
return MessageDigest.getInstance("SHA-1").digest(input);
}
试验
输出
[-96、-1、78、94、-67、-96、-113、12、-31、93、-10、-55、-5、72、-2、-57、52、-84、-117、40]
除了打印为有符号字节与无符号字节外,与相同:
[160、255、78、94、189、160、143、12、225、93、246、201、251、72、254、199、52、172、139、40]
Java加密体系结构表示算法类型的对象,如MessageDigest
,以及Cipher
和Mac
都实现了一种方案,使得对大量数据执行逐段操作成为可能。他们通过使用更新内部状态和最终操作(如签名/验证)的方法来实现这一点,或者对于MessageDigest
,使用一个名为digest
的单一操作,使用各种重载
这些算法还有一个共同点,即当调用“final”操作时,对象的状态在初始化后直接重置为状态。此状态通常在调用init
方法后达到
但是,像SHA-1这样的散列算法不需要显式初始化,因此它们在实例化后直接返回到状态:即它们尚未处理任何数据的状态。这样,可以重用哈希算法来哈希另一个值。这比实例化一个新对象稍微高效一些
从:
计算消息摘要后,消息摘要对象将自动重置,并准备接收新数据并计算其摘要。所有以前的状态(即,提供给更新调用的数据)都将丢失
因此,在调用digest()
后,对象将重置为尚未接收任何数据的状态。因此,第二个调用返回空八进制字符串/字节数组上的哈希值
引述如下: 它与有符号字节相同,即您在注释中输入的值
打印的正确哈希确实是
A0FF4E5EBDA08F0CE15DF6C9FB48FEC734AC8B28
大写十六进制或
[160, 255, 78, 94, 189, 160, 143, 12, 225, 93, 246, 201, 251, 72, 254, 199, 52, 172, 139, 40]
作为Python中的无符号字节数组。请注意,Java使用有符号字节,因此这将等于
[-96, -1, 78, 94, -67, -96, -113, 12, -31, 93, -10, -55, -5, 72, -2, -57, 52, -84, -117, 40]
要计算此值,只需调用
MessageDigest#digest(byte[]input):byte[]
就足够了,在您的情况下,可以是byte[]digest=msdigest.digest(input)
,然后可以首先打印出digest
,然后返回包含字节数组的变量
请注意,哈希仍然不应在多个线程上同时使用;一次只能计算一个哈希;这些类不是线程安全的。您使用的是什么代码?你得到了什么结果?你期望得到什么结果?David说的,让我们看看Python和Java代码,输入和输出。对不起,我现在把代码放在问题中,前缀是什么?删除print语句。调用摘要是破坏性的,您需要调用它两次-您从方法返回的值是不正确的,因为我不同意Erwin Bolwidt或Andreas的措辞。
MessageDigest
对象的(状态)未被破坏,它被重置为已知的有效状态。
[160, 255, 78, 94, 189, 160, 143, 12, 225, 93, 246, 201, 251, 72, 254, 199, 52, 172, 139, 40]
[-96, -1, 78, 94, -67, -96, -113, 12, -31, 93, -10, -55, -5, 72, -2, -57, 52, -84, -117, 40]