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

Groovy和Python之间SHA-1哈希的不同结果,groovy,sha1,Groovy,Sha1,这个问题与我题为“在SoapUI Pro中为REST web服务创建WS-security头”的查询有关。然而,当我提出这一点时,它是不同的,因为我根本无法让脚本工作,我想出了一个解决方案,但它只在大约66%的时间工作 我注意到,与对相同输入进行散列的python脚本相比,我用来散列字符串的代码有时会产生不同的结果 下面是对输入值进行散列的groovy代码 MessageDigest cript2 = MessageDigest.getInstance("SHA-1"); cri

这个问题与我题为“在SoapUI Pro中为REST web服务创建WS-security头”的查询有关。然而,当我提出这一点时,它是不同的,因为我根本无法让脚本工作,我想出了一个解决方案,但它只在大约66%的时间工作

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

下面是对输入值进行散列的groovy代码

MessageDigest cript2 = MessageDigest.getInstance("SHA-1");
        cript2.update(nonce.getBytes("ASCII"));
        PasswordDigest = new String(cript2.digest());
如果我使用输入的nonce值201703281329运行它,它将产生以下结果 ëËÐùìÓ0¼ÕM�⑨,óßPè

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

digest = sha.new(nonce).digest()
但是,如果我使用输入值201703281350运行groovy和python脚本,那么它们都会生成

iávèèèèèèèm:F˾

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


非常感谢。

如果您比较两种语言的摘要方法返回的字节,您会发现它们确实是相同的。原因是某些字节组合不会产生可打印的Java字符串

要比较它们:

def hexString = PasswordDigest.collect { String.format('%02x', it) }.join()
sha.hexdigest()
的输出进行比较:

两者都应产生
ebb1cbcbd0f9ecd330bcd51b4d8fb92cf3df508b

已编辑

也许我没有明确说明passwordDigest不应转换为字符串。下面是完整的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

如果比较两种语言的摘要方法返回的字节,您会发现它们确实相同。原因是某些字节组合不会产生可打印的Java字符串

要比较它们:

def hexString = PasswordDigest.collect { String.format('%02x', it) }.join()
sha.hexdigest()
的输出进行比较:

两者都应产生
ebb1cbcbd0f9ecd330bcd51b4d8fb92cf3df508b

已编辑

也许我没有明确说明passwordDigest不应转换为字符串。下面是完整的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

Hi sjtai。谢谢你的回答,但是我发现它们不会产生相同的结果。groovy代码def hextstring=PasswordDigest.getBytes().collect{String.format('%02x',it)}.join()生成ebb1cbcbd0f9ecd330bcd51b4d3fb92cf3df508b,而python代码hextstring=sha.new(CREATIONDATE).hextDigest()生成EBB1CBD0F9ECD330BCD51B4D8FB92CF3DF508B。这是1个字符不同的3对8。谢谢Sjtai。对不起,迟了答复。没有看到您的编辑。这就是我错的地方。实际上,我在这个查询上发布了我的全部问题,并在根据您的建议进行更改后更新了答案。脚本现在一直在创建正确的密码摘要值,而不仅仅是以前的一些时间。您好。谢谢你的回答,但是我发现它们不会产生相同的结果。groovy代码def hextstring=PasswordDigest.getBytes().collect{String.format('%02x',it)}.join()生成ebb1cbcbd0f9ecd330bcd51b4d3fb92cf3df508b,而python代码hextstring=sha.new(CREATIONDATE).hextDigest()生成EBB1CBD0F9ECD330BCD51B4D8FB92CF3DF508B。这是1个字符不同的3对8。谢谢Sjtai。对不起,迟了答复。没有看到您的编辑。这就是我错的地方。事实上,我在这个查询上发布了我的全部问题,并在根据您的建议进行更改后更新了答案。脚本现在一直在创建正确的密码摘要值,而不是像以前那样只是在某些时候创建。