Python rsa库验证React Native生成的公钥与签名失败求助
RSA签名验证问题修复方案
第一个报错AssertionError根因与修复
触发该报错有三个明确问题:
rsa.verify方法的第一个入参要求为bytes类型或支持read()方法的类文件对象,你传入了字符串类型的payload,不符合参数要求触发断言失败- 变量名混用错误:你定义公钥字符串变量为
publicKey,拼接PEM格式时错误调用了未定义的public_key变量,后续加载得到公钥对象存入public_key后,调用验证方法时又错误传入了原始字符串publicKey,参数类型完全不匹配 - 缺少
base64库导入,你调用了base64.b64decode但未引入对应依赖
修复后的验证代码如下:
import rsa import base64 publicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ukwwhq00ZmVtY1dswdVUg0tDNAbPt/GCWRUua1zsmeKT90NP3rsAEbIHJ89mQJ5/fVrl+umS5uq3F7AdZNh2R269KLV2MSytoMWR2zLD4oVUdDSwbEu8h1cx8s8vk6QpjmvZkxXYWXM1kh+9AqEjsWL3gE5hShOaqf8zl1k9pjZVywndaFi7/SsvQGy6WlSZT7cPyF/xwxGOBe3h9nijlhCIpR9AkbTSsQrVRz+iudGLSuuzS09hgX6fdqcRqR+T2UocfGJrSAqBhHVPeCksQ/OgwGJtaZQde+Cu/9FGa9LAdRcMm/WUILLlv2Dn7DGjhe/S8xvsZh7p7ghYbgxwwIDAQAB' payload = 'some test payload' signature = 'DB1E4dSOoA9avqhR6I2vnQQJ4Ktptsq/Z89afh0tX9gcCfWzBnkBySaeY0MjIHTOUqKimbRfFxb4NDIBCgIu/bQufIrESIl8v/U6jHPleP5wn9fh+p02mvTKUSDU8p6zBygXiGUe2SWwHaGzYvHDIW1Rm6mL22kv1qTkMhRQsVsBAgVtn8vHx6yMvN+XmQAM0Z2BDecC2kyfjZrBkJT7stzHW/1fT4GiVmoC7haaR2JRdHlGWBZXktmUvqo8xEdgYyMq582Q6N+Jw6Ic7TQc+584yviSgB3fAg32b7z5NdRVAwS2FCbLkC7DQNn+WCBk6XHOwKuu1XR9eUWU+k0Qgg==' pem_prefix = '-----BEGIN PUBLIC KEY-----\n' pem_suffix = '\n-----END PUBLIC KEY-----' # 修正变量名,用公钥字符串拼接PEM key = '{}{}{}'.format(pem_prefix, publicKey, pem_suffix) public_key_obj = rsa.PublicKey.load_pkcs1_openssl_pem(key) signature_bytes = base64.b64decode(signature) # payload转bytes,传入公钥对象,hash_method取值要和RN端签名用的哈希算法对齐,默认值为SHA-1 rsa.verify(payload.encode('utf-8'), signature_bytes, public_key_obj, hash_method="SHA-256")
第二个报错SubstrateUnderrunError根因
你将签名内容当做RSA私钥加载的逻辑完全错误:签名是私钥对payload哈希计算后得到的结果,和RSA私钥的PEM格式没有任何关联,自然会触发ASN.1结构解码失败,这部分代码没有任何作用,直接删除即可。
额外验证注意事项
必须保证React Native端签名时的哈希算法、编码规则和Python端完全一致,比如两端payload的编码都是UTF-8、签名用的哈希算法同为SHA-256,否则即使修复上述问题也会验证失败。
内容的提问来源于stack exchange,提问作者Efosa
相关产品推荐
相关产品推荐

