如何通过API Manager加密API的响应负载?
如何用API Manager加密API响应负载
先明确核心前提:你需要和客户端提前约定好加密算法(比如AES-256-GCM、RSA)、密钥交换方式(比如客户端预提供公钥,或通过密钥管理服务分发),且所用API Manager必须支持响应拦截/转换功能(主流产品都满足)。以下是主流API Manager的具体操作步骤:
一、WSO2 API Manager 操作步骤
- 登录WSO2 API Publisher,找到目标API进入编辑页
- 切换到Message Mediation标签,选择Response Flow
- 添加自定义中介(Mediator):
- 选择Custom Mediator点击添加
- 在代码编辑器中编写Synapse加密逻辑示例(实际密钥需存到WSO2密钥管理器,禁止硬编码):
<sequence xmlns="http://ws.apache.org/ns/synapse" name="EncryptResponse"> <property name="RESPONSE" value="true" scope="default" type="STRING"/> <payloadFactory media-type="json"> <format>{"encryptedData": "$1"}</format> <args> <arg evaluator="xml" expression="base64Encode(encrypt(get-property('MESSAGE_PAYLOAD'), 'AES', 'your-secret-key', 'GCM'))"/> </args> </payloadFactory> </sequence>
- 保存API并重新发布,调用API即可得到加密后的响应
二、Apigee Edge 操作步骤
- 登录Apigee控制台,进入目标API的Proxy Editor
- 在Response Flow的Target Response阶段添加JavaScript Policy
- 编写JS加密逻辑示例:
var payload = context.getVariable('response.content'); var crypto = require('crypto'); var algorithm = 'aes-256-gcm'; var key = Buffer.from('your-32-byte-secret-key', 'utf8'); var iv = crypto.randomBytes(12); var cipher = crypto.createCipheriv(algorithm, key, iv); var encrypted = Buffer.concat([cipher.update(payload, 'utf8'), cipher.final()]); var authTag = cipher.getAuthTag(); // 将IV、authTag和加密数据一起返回给客户端 var encryptedResponse = JSON.stringify({ iv: iv.toString('base64'), authTag: authTag.toString('base64'), data: encrypted.toString('base64') }); context.setVariable('response.content', encryptedResponse); - 部署更新后的API Proxy,测试验证加密效果
三、Kong API Gateway 操作步骤
- 先确保安装并启用
lua-resty-string和lua-resty-crypto插件(未预装则手动安装) - 通过Kong Admin API添加
pre-function插件实现响应加密:curl -X POST http://kong:8001/services/{your-service}/plugins \ --data "name=pre-function" \ --data "config.access[]=local crypto = require('resty.crypto')" \ --data "config.access[]=local payload = kong.response.get_raw_body()" \ --data "config.access[]=local key = 'your-secret-key'" \ --data "config.access[]=local encrypted, err = crypto.encrypt('aes-256-gcm', key, payload)" \ --data "config.access[]=if not encrypted then kong.log.err(err) return end" \ --data "config.access[]=kong.response.set_raw_body('{\"encryptedData\":\"' .. ngx.encode_base64(encrypted) .. '\"}')" - 调用API验证响应是否已加密
关键注意事项
- 密钥管理:绝对禁止硬编码密钥,必须用API Manager自带密钥管理服务或第三方KMS(如AWS KMS、HashiCorp Vault)存储调用
- 客户端兼容:必须和客户端明确约定算法、IV规则(对称加密时)、编码方式等,确保对方能正常解密
- 性能影响:加密会增加响应延迟,建议对大负载做性能测试,必要时启用硬件加速
- 日志安全:禁止在API Manager日志中记录明文敏感数据,仅保留加密后的内容
内容的提问来源于stack exchange,提问作者Venuke
相关产品推荐
相关产品推荐

