python使用有效负载和公钥字符串验证数字签名

2024-10-01 09:32:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段数据['payload']是Base64编码的。 然后我有一个包含有效载荷签名的“签名”。 我有一个公钥。 签名算法是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"

Tags: 数据keyfromimportcryptorsahashlibpayload
1条回答
网友
1楼 · 发布于 2024-10-01 09:32:48

问题中的代码有两个错误,按出现顺序排列:

  • 导入了两个不同的SHA512实现
  • 有效负载显然不是base64编码的,普通的base64不表示文本,也不包含u字符(但是base-64-url是这样)
  • signature_algorithm和{}变量甚至没有使用
  • 不应将key散列以实现普通的PSS签名方案
  • 忽略m.hexdigest()的结果
  • 不能通过SHA512.new(rsakey)生成签名生成类
  • 如前所述,您的代码甚至不能编译,因为SHA512类不能签名

相反,您可以使用任何其他PSS示例代码。例如,使用代码here,注意这是我所指的一个问题。这是一个最小的改变,但似乎没有人想修复半年。在

from Crypto.Signature import PKCS1_PSS
from Crypto.Hash import SHA512
from Crypto.PublicKey import RSA
from Crypto import Random
message = 'To be signed'
key = RSA.importKey(open('privkey.der').read())
h = SHA512.new()
h.update(message)
signer = PKCS1_PSS.new(key)
signature = PKCS1_PSS.sign(h)

请注意,PSS也可以在内部使用散列,如果签名验证失败,您可能需要定义自己的可调用代码,更多信息here。也许最好在代码中查找MGF1的默认实现,复制它,然后更改哈希。。。在

相关问题 更多 >