Python 密码模块 public_key verify() 方法

Python cryptography module public_key verify() method

我在 python 3.8.5,使用密码学 2.9.2。我需要从 public 密钥验证数字签名,但我对密码学中的填充 class 感到非常困惑。

public 密钥和签名在 XML 文件中发送给我。使用 LXML,我将文件加载到变量 inxml 中并使用此代码获取这些项目。此代码有效。

message = inxml.findall('//message).text #The message that was signed.
user-key = inxml.findall('//pubkey')[0].text #The text file ---BEGIN PUBLIC KEY--- and so on.
c=bytes(user0key.encode()) #Convert the string to a bytes object.
user-key = serialization.load_pem_public_key(c, backend=default_backend()) #Use the py-cryptography method to make a public-key object.
user-sig = inxml.findall('//signature')[0].text #Get the base64-encoded signature.
user-sig = base64.b64decode(user-sig) #Decode the signature back to binary. 

这给了我:

下一行代码报错:

user-key.verify(user-sig, message, padding.PKCS7(128), hashes.SHA512)

我得到的错误是:

Expected instance of hashes.HashAlgorithm

创建 XML 文件的人使用这些命令创建了签名(在 Powershell 中): ./openssl.exe dgst -sha512 -sign $private-key -passin pass:$password -out sig.sig $message ./openssl.exe base64 -in sig.sig -out $base64

然后将 $base64 变量放入 XML 文件中。

我不明白为什么使用 hashes.SHA512 会导致错误。而且我真的根本不理解填充参数。有人能指出我正确的方向吗?

这里有两个问题。假设您正在调用 RSAPublicKey.verify,文档指出填充需要是 AsymmetricPadding 的实例,而不是对称填充实例。由于这是一个签名,因此可能使用两种可能的填充:PSS 或 PKCS1v15。找出它应该是哪一个会很有用,但您也可以尝试 PKCS1v15(很可能是),看看它是否有效。

您遇到的另一个问题是此方法需要哈希实例,而不是裸实例 class。换句话说,您应该传递 hashes.SHA512(),而不是 hashes.SHA512