【发布时间】:2017-12-08 07:53:57
【问题描述】:
我有一个 Base64 编码的数据 ['payload']。 然后我有一个包含有效负载签名的“签名”。 我有一个公钥。 签名算法是SHA512withRSA
如何在 Python 中验证数据的真实性? 我正在使用以下代码进行检查,但它似乎不起作用
import base64
import hashlib
from Crypto.PublicKey import RSA
from Crypto.Signature import SHA512
from Crypto.Hash import SHA512
from base64 import b64decode
# Public Key
key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEpFwIarbm48m6ueG+jhpt2vCGaqXZlwR/HPuL4zH1DQ/eWFbgQtVnrta8QhQz3ywLnbX6s7aecxUzzNJsTtS8VxKAYll4E1lJUqrNdWt8CU+TaUQuFm8vzLoPiYKEXl4bX5rzMQUMqA228gWuYmRFQnpduQTgnYIMO8XVUQXl5wIDAQAB"
# Base64 Encoded payload
payload = "some_string_payload"
decoded_payload = base64.b64decode(payload)
signature = "gw5K+WvO43673XBinZOmwgrZ3ttVuZ17/7SBnzqAAD4pgiwzYbZuEwn2lev6FW01f6TL0d9cNH4WtT53bQnTlhLQOZi4mHTTtM64O7MNljSA5zjJTUl77wXK/cJM+/G6R4YgYAnjydXAZjbMKY4Z9kV0qz2spdnS7Je7Q8I1xaU="
signature_algorithm = "SHA512withRSA"
keytype = "RSA"
m = hashlib.sha512()
m.update( key )
m.update( decoded_payload )
print m
m.hexdigest()
print m
keyDER = b64decode(key)
rsakey = RSA.importKey(keyDER)
signer = SHA512.new(rsakey)
if signer.verify(m, b64decode(signature)):
print "Verified"
else:
print "Not Verified"
【问题讨论】:
-
您提供的签名是 1024 位长,但来自 SHA512 的签名应该只有 512 位长。这意味着您要么有错误的签名,要么有错误的算法。请使用新信息更新您的问题。另外,是否可以显示生成签名的代码?我们不需要私钥。
-
这与您验证 RSA 签名的方式相差甚远。
signer.verify()应该抛出异常,因为签名者实际上是一个 Hash 对象并且没有verify方法。 -
每个带有“但它似乎不起作用”这样的文字并且没有包含问题的完整描述的问题都应该作为题外话关闭。
标签: python digital-signature public-key signing verify