Groovy 和 Python 之间 SHA-1 哈希的不同结果

Different results for SHA-1 hashing between Groovy and Python

这个问题与我的标题为 "Create WS security headers for REST web service in SoapUI Pro" 的查询有关。然而,这个与我提出的不同,因为我根本无法让脚本工作,我想出了一个解决方案,但它只在大约 66% 的时间内工作。

我注意到我用来散列字符串 的代码有时 与散列相同输入的 python 脚本相比会产生不同的结果。

下面是我的 groovy 散列输入值的代码。

MessageDigest cript2 = MessageDigest.getInstance("SHA-1");
        cript2.update(nonce.getBytes("ASCII"));
        PasswordDigest = new String(cript2.digest());

如果我 运行 它与输入随机数值 201703281329 它产生以下 ë±ÈÈÐùìÓ0¼ÕM�¹,óßP‹

如果我使用下面的 Python 代码使用相同的输入值,那么它会生成 ëᄆÈÈÐùìÓ0ᄐÕMマᄍ,óßPヒ

digest = sha.new(nonce).digest()

但是,如果我 运行 输入值为 201703281350 的 groovy 和 python 脚本,那么它们都会产生 ..

iàv詮ɹm:F È Â¾

有人能告诉我为什么我看到某些输入值不同而其他输入值不同,以及如何修改我的 groovy 代码以使其产生与 Python 代码相同的值?

非常感谢。

对比一下两种语言的digest方法返回的字节,你会发现它们确实是一样的。原因是某些字节组合不会产生可打印的 Java 字符串。

比较它们:

def hexString = PasswordDigest.collect { String.format('%02x', it) }.join()

sha.hexdigest()的输出比较:

def hexString = sha.new(nonce).hexdigest()

两者都应该产生 ebb1cbcbd0f9ecd330bcd51b4d8fb92cf3df508b

已编辑

也许我没有说清楚passwordDigest 不应该被转换成String。下面是完整的 groovy 和 python 代码。两个程序产生相同的输出:

Groovy:

import java.security.*

String nonce = '201703281329'
MessageDigest digest = MessageDigest.getInstance("SHA-1")
digest.update(nonce.getBytes("ASCII"))

byte[] passwordDigest = digest.digest() // byte[], not string

String hexString = passwordDigest.collect { String.format('%02x', it) }.join()

println hexString

Python:

import sha

nonce = '201703281329'
sha.new(nonce).hexdigest()
print sha.new(nonce).hexdigest()

两者的输出:ebb1cbcbd0f9ecd330bcd51b4d8fb92cf3df508b.