API接口如何加密传输
在开发网页应用或移动App时,前后端数据交互基本都靠API接口完成。比如你用手机查天气,App会向服务器发送一个请求,服务器返回当天的温度、湿度等信息。这个过程看似简单,但如果数据是明文传输,就像把银行卡号写在明信片上寄出去,谁都能看到。
所以,API接口必须加密传输,防止敏感信息被截获或篡改。常见的做法不是自己造轮子,而是直接使用成熟的技术方案。
用HTTPS是最基本的操作
很多开发者一开始只写HTTP接口,数据裸奔在网络里。换成HTTPS,只需要在服务器配置SSL证书,前端请求地址从http://改成https://就行。浏览器和服务器之间的通信自动加密,中间人看不到真实内容。
比如原来请求是:
<code>http://api.example.com/weather?city=北京</code>
改成:
<code>https://api.example.com/weather?city=北京</code>
虽然只是换了个协议,但整个链路已经加密了。
对参数做签名防篡改
即使用了HTTPS,有些场景还需要进一步保护。比如支付接口,不能让别人抓包后修改金额重放请求。这时候可以在参数里加一个签名(sign)。
流程通常是:把所有参数按字段名排序,拼成一个字符串,加上密钥,用MD5或HMAC-SHA256算出签名,一起发给服务器。服务器收到后按同样规则计算,对比签名是否一致。
参数示例:
timestamp=1712345678
nonce=abc123
data=%7B%22amount%22%3A+100%7D
app_key=xxxxxx
拼接字符串:
app_key=xxxxxx&data=%7B%22amount%22%3A+100%7D&nonce=abc123×tamp=1712345678&secret=your_secret_key
生成sign:
sign=HMAC-SHA256(拼接字符串, secret)这样即使别人截获请求,改了amount,签名对不上,服务器直接拒绝。
敏感数据单独加密
有些字段特别敏感,比如用户密码、身份证号,光靠HTTPS还不够安心。可以在提交前用AES或RSA先加密一层。
比如登录时,前端用JavaScript引入crypto库,把密码加密后再传:
// 伪代码示意
const encryptedPwd = AES.encrypt(password, 'public_key_from_server');
fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ username: 'user1', password: encryptedPwd })
});服务器用对应的私钥解密,再验证密码。这样就算HTTPS被降级,密码也不会暴露。
别忘了设置请求有效期
签名机制再强,也怕别人录下整个请求反复发送(重放攻击)。可以在每次请求里带上时间戳(timestamp),服务器判断如果这个请求超过5秒就没效,直接丢弃。
比如timestamp=1712345678,服务器当前时间是1712345700,差了22秒,就认为过期。配合随机数nonce,确保每个请求唯一,安全性又上一层楼。