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

如何在AWS Gateway与Lambda中处理字符串类型的加密二进制Payload?

问题分析与解决方法

问题核心在于:API Gateway传递Query参数时,会对Base64编码中的特殊字符(如+、/、=)进行URL编码/解码处理,导致你拿到的字符串和原始二进制Payload的Base64编码不一致,最终解密失败。

关键原因

标准Base64的+、/属于URL特殊字符,若前端未使用URL安全的Base64编码,这些字符会被浏览器/API Gateway自动转义,比如+会被转成%2B,API Gateway的queryStringParameters会自动将其解码回+,但如果前端传递时未做正确编码,可能导致字符丢失或篡改;另外部分场景下会省略Base64的末尾填充符=,也会导致解码后的字节数据错误。

正确处理步骤

  1. 将URL传递的字符串转换为标准Base64格式:
    • 替换URL安全字符(若前端用了URL安全编码):把-换回+,_换回/
    • 补全Base64的填充符=:Base64字符串长度必须是4的倍数,不足时补=
  2. 再执行Base64解码和RSA解密

修改后的Lambda代码

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

def lambda_handler(event, context):     
    # 获取Query参数中的payload字符串
    str_64_enc = event['queryStringParameters']['payload']
    
    # 转换为标准Base64格式
    # 替换URL安全字符(适配前端可能的URL安全编码)
    standard_b64 = str_64_enc.replace('-', '+').replace('_', '/')
    # 补全填充符
    padding_length = len(standard_b64) % 4
    if padding_length != 0:
        standard_b64 += '=' * (4 - padding_length)
    
    # Base64解码为字节
    str_enc = base64.b64decode(standard_b64)
    
    # RSA解密
    try:
        pr_key = RSA.importKey(open('private_pem.pem', 'r').read())
        decryptor = PKCS1_OAEP.new(key=pr_key)
        decrypted_message = decryptor.decrypt(str_enc)
        print(f"解密结果: {decrypted_message}")
        
        return {
            'statusCode': 200,
            'body': decrypted_message.decode('utf-8')  # 假设解密后为UTF-8字符串,可根据实际调整编码
        }
    except ValueError as e:
        print(f"解密失败: {str(e)}")
        return {
            'statusCode': 400,
            'body': '无效的加密Payload'
        }

额外建议

  • 建议前端使用URL安全的Base64编码(将+替换为-,/替换为_,去掉末尾=)后再作为Query参数传递,这样能避免URL转义带来的问题
  • 解密时添加异常捕获,方便快速排查Payload无效、密钥不匹配等问题

内容的提问来源于stack exchange,提问作者Yang L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:45:43