如何使用JavaScript结合RSA公钥解码JSON Web Token并重新编码?
关于RSA公钥解密与重新编码的脚本方案
嘿,我来帮你理清楚这个问题并给出可行的脚本方案~首先得先澄清一个RSA的核心逻辑:公钥负责加密,私钥负责解密;私钥负责签名,公钥负责验签。如果你的场景确实需要用公钥解密,那说明原始数据是用对应证书的私钥加密的(这种用法不多见,但技术上是可行的)。下面我用Python的cryptography库给你写一套完整的脚本,涵盖从证书提取公钥、解密数据、处理JSON、重新加密的全流程。
第一步:安装依赖
首先确保你安装了cryptography库,这是Python生态里处理加密的主流库:
pip install cryptography
第二步:完整脚本实现
from cryptography import x509 from cryptography.hazmat.primitives import serialization, hashes from cryptography.hazmat.primitives.asymmetric import padding import json # 1. 从证书文件中提取RSA公钥 def get_public_key_from_cert(cert_path): with open(cert_path, "rb") as cert_file: cert_data = cert_file.read() cert = x509.load_pem_x509_certificate(cert_data) public_key = cert.public_key() return public_key # 2. 使用公钥解密数据(注意:原始数据必须是用对应私钥加密的) def decrypt_with_public_key(public_key, encrypted_data): decrypted_data = public_key.decrypt( encrypted_data, # 这里的填充方式要和加密时保持一致,OAEP是比较安全的选择 padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) # 解密后得到JSON字符串,解析为字典 return json.loads(decrypted_data.decode("utf-8")) # 3. 使用公钥加密处理后的JSON数据 def encrypt_with_public_key(public_key, json_data): # 将字典转为JSON字符串 json_str = json.dumps(json_data).encode("utf-8") encrypted_data = public_key.encrypt( json_str, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) return encrypted_data # 主流程示例 if __name__ == "__main__": # 替换为你的证书路径 cert_path = "your_certificate.pem" # 替换为后端传来的加密数据(bytes类型) encrypted_data = b"your_encrypted_data_here" # 提取公钥 pub_key = get_public_key_from_cert(cert_path) # 解密得到JSON数据 original_json = decrypt_with_public_key(pub_key, encrypted_data) print("解密后的原始JSON:", original_json) # 处理JSON数据(这里示例为修改某个字段) original_json["status"] = "processed" print("处理后的JSON:", original_json) # 重新加密 re_encrypted_data = encrypt_with_public_key(pub_key, original_json) # 这里可以将re_encrypted_data返回给后端 print("重新加密后的数据(bytes):", re_encrypted_data)
关键注意事项
- 填充方式必须一致:解密和加密时的填充算法(比如上面用的OAEP-SHA256)必须和后端使用的完全相同,否则会解密失败或后端无法解密你的加密数据。
- RSA长度限制:RSA加密的内容长度不能超过公钥长度减去填充占用的字节数(比如2048位公钥最多加密245字节左右的数据)。如果你的JSON数据很大,建议改用对称加密+RSA加密对称密钥的方案,不然会报错。
- 证书格式:上面的脚本假设你的证书是PEM格式(以
-----BEGIN CERTIFICATE-----开头),如果是DER格式,需要把x509.load_pem_x509_certificate换成x509.load_der_x509_certificate。
如果你的场景其实是验签而不是解密(比如后端用私钥签名了JSON,你需要验证签名后再处理),可以随时告诉我,我再给你调整脚本~
内容的提问来源于stack exchange,提问作者LiquidSnake
相关产品推荐
相关产品推荐

