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.
这给了我:
- 字符串形式的消息
- 用户密钥类型 public_key
- 用户签名为字节。
下一行代码报错:
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
。
我在 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.
这给了我:
- 字符串形式的消息
- 用户密钥类型 public_key
- 用户签名为字节。
下一行代码报错:
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
。