You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:11:02