我的目标是让签名结果与服务器的结果一致。我听说签名可能涉及随机性,每次都会导致不同的结果,但在实践中,当我使用密码学库时:
signature = privateKey.sign(data, padding.PKCS1v15(), hashes.SHA256())
每次的结果都是一致的,并且与服务器的结果相匹配。我想简化导入,只使用 Crypto 或 cryptodome。使用带有以下代码的 cryptodome 时:
dataHash = SHA256.new(data)
signature = PKCS1_v1_5.new(privateKey).sign(dataHash)
结果每次都不同,可能是由于盐的原因。
我想问是否可以像 Crypto 或 cryptodome 中的密码学那样每次都生成相同的签名。谢谢!
每次使用 PyCryptodome 看到不同结果的原因是,默认情况下,它使用 PSS(概率签名方案)填充,出于安全原因,它引入了随机性。
使用
pkcs1_15.new(private_key).sign(hash_obj)
使用 PKCS#1 v1.5 填充对哈希进行签名,将产生一致的结果。
这里我们使用
Crypto.Signature.pkcs1_15
而不是 Crypto.Signature.PKCS1_v1_5
。 pkcs1_15 模块较新,推荐使用。
我们明确使用 PKCS#1 v1.5 填充,与 PSS 填充不同,它不会引入随机性。
使用 from Crypto.Signature import pkcs1_15
导入