为什么API网关需要数据加密
公司内部系统越来越多依赖API进行数据交互,比如订单系统调用支付接口,用户中心对接登录服务。这些请求一旦经过公网传输,就像把信件写在明信片上寄出,谁都能看到内容。攻击者可能截取敏感信息,比如用户手机号、身份证号,甚至伪造请求发起恶意操作。
API网关作为所有请求的统一入口,天然适合承担加密任务。它不像每个微服务单独处理加密那样重复造轮子,而是在入口处集中加解密,省事又可靠。
常见加密方式怎么选
对称加密速度快,适合高频调用场景。比如用AES算法,前后端共享一个密钥,请求前加密,网关收到后解密再转发。但密钥分发要小心,别硬编码在代码里,建议通过配置中心动态获取。
非对称加密更安全,适合跨企业对接。比如合作伙伴调用你的API,用RSA公钥加密数据,网关用私钥解密。即使公钥泄露也不会影响安全性,但计算开销大一些,不适合高并发短请求。
实际配置示例
以Nginx + Lua实现的API网关为例,在请求进入时自动解密:
local aes = require "resty.aes"
local cjson = require "cjson"
local function decrypt_data(encrypted_b64)
local key = "your-32-byte-secret-key-12345678"
local aes_128_cbc = aes:new(key, nil, aes.cipher(128,"cbc"))
local encrypted = ngx.decode_base64(encrypted_b64)
return aes_128_cbc:decrypt(encrypted)
end
local post_args = ngx.req.get_post_args()
local encrypted_data = post_args["data"]
if encrypted_data then
local plain_text = decrypt_data(encrypted_data)
ngx.req.set_body_data(plain_text)
end这段Lua脚本会在请求到达时自动解密body中的data字段,后续服务接收到的就是明文数据,完全无感。
注意这些细节
加密不是加完就万事大吉。时间久了密钥可能泄露,建议定期更换,最好支持多版本密钥并行,避免切换时大面积故障。另外,加密后的数据体积会变大,特别是Base64编码后增大约33%,要留意POST body大小限制。
还有个小技巧:可以只加密敏感字段,比如身份证、银行卡号,其他普通参数保持明文。这样既保障核心数据安全,又减少性能损耗,适合对延迟敏感的业务。
监控和调试别忽视
上线后发现某个接口频繁报文格式错误,查了半天才发现是客户端加密时漏了URL编码,导致+号变成空格。这类问题在生产环境很难排查。
建议在网关日志中记录加解密状态,比如是否成功、耗时多少,但绝不能打印原始数据。可以用唯一请求ID串联上下游日志,出问题时快速定位环节。