这个问题与我题为“在 SoapUI Pro 中为 REST web 服务创建 WS 安全标头”的查询有关。然而,当我提出这个问题时有所不同,因为我根本无法让脚本工作,我想出了一个解决方案,但它只有大约 66% 的时间有效。
我注意到,与对相同输入进行哈希处理的 Python 脚本相比,我用来对字符串进行哈希处理的代码有时会产生不同的结果。
下面是我对输入值进行哈希处理的常规代码。
MessageDigest cript2 = MessageDigest.getInstance("SHA-1");
cript2.update(nonce.getBytes("ASCII"));
PasswordDigest = new String(cript2.digest());
Run Code Online (Sandbox Code Playgroud)
如果我使用输入随机数值 201703281329 运行它,它会产生以下 ë±ËËÐùìÓ0¼ÕM?¹,óßP‹
如果我使用下面的 Python 代码使用相同的输入值,那么它会产生 ë?ËËÐùìÓ0?ÕM??,óßP?
digest = sha.new(nonce).digest()
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用输入值 201703281350 运行 groovy 和 python 脚本,那么它们都会产生 ..
iàv詮ɹm:F Ë Â¾
有人能告诉我为什么我看到某些输入值而不是其他输入值的差异,以及我如何修改我的常规代码以使其产生与 Python 代码相同的值?
非常感激。
如果比较两种语言的digest方法返回的字节数,你会发现它们确实是一样的。原因是某些字节组合不会产生可打印的 Java 字符串。
比较它们:
def hexString = PasswordDigest.collect { String.format('%02x', it) }.join()
Run Code Online (Sandbox Code Playgroud)
与 的输出比较sha.hexdigest()
:
def hexString = sha.new(nonce).hexdigest()
Run Code Online (Sandbox Code Playgroud)
两者都应该产生 ebb1cbcbd0f9ecd330bcd51b4d8fb92cf3df508b
已编辑
也许我没有说清楚 passwordDigest不应该转换为 String。下面是完整的 groovy 和 python 代码。两个程序产生相同的输出:
常规:
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
Run Code Online (Sandbox Code Playgroud)
Python:
import sha
nonce = '201703281329'
sha.new(nonce).hexdigest()
print sha.new(nonce).hexdigest()
Run Code Online (Sandbox Code Playgroud)
两者的输出:ebb1cbcbd0f9ecd330bcd51b4d8fb92cf3df508b
。