Groovy和Python之间的SHA-1散列的结果不同

时间:2017-03-28 13:50:35

标签: groovy sha1

此问题与我的标题为“在SoapUI Pro中为REST Web服务创建WS安全标头”的查询相关。然而,因为我提出这个问题,因为我无法让脚本完全工作,所以我提出了一个解决方案,但它只能在66%的时间内工作。

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

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

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

如果我使用输入的nonce值201703281329运行它,它会生成以下内容 ë±ËËÐùìÓ0¼ÕM¹,OSSP << / P>

如果我使用下面的Python代码使用相同的输入值,那么它会产生ëㅁËËÐùìÓ0ㅌÕMマㅉ,óßPヒ

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

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

iàvè©®Ém:F˾

有人能告诉我为什么我看到某些输入值的差异而不是其他输入值以及如何修改我的常规代码以便它生成与Python代码相同的值?

非常感谢。

1 个答案:

答案 0 :(得分:4)

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

比较它们:

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

sha.hexdigest()的输出进行比较:

def hexString = sha.new(nonce).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