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
.
这个问题与我的标题为 "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
.