接口安全开发中,加密与签名是最易混淆的核心操作,不少开发者因二者概念不清、用途混淆,导致接口出现数据篡改、身份伪造等安全漏洞。
一、加密与签名的核心区别
核心区分:加密是“隐藏内容”(保机密),签名是“证明身份+防篡改”(验合法):
- 加密:用密钥转换数据,保障机密性,仅接收方可解密,不验证身份和完整性。
- 签名:发送方用私钥生成签名,服务端用公钥验签,确认数据合法且未篡改,不防窃取。
关键:二者常协同使用,不可混淆单一作用。
二、服务端签名验签核心逻辑
本质是“双方约定规则,服务端校验一致性”,核心3步:
1. 客户端:按约定规则+密钥生成签名,与请求参数、时间戳、随机数一同发送;
2. 服务端:提取信息,按相同规则重新生成签名;
3. 校验:比对签名,一致则通过,反之拒绝。
核心原则:客户端与服务端加签规则必须完全一致。
三、服务端验签实战步骤
步骤1:约定规则(客户端同步)
- 筛选参与加签的参数,确保双方一致;
- 参数按字典序排序,避免无序导致签名异常;
- 约定算法,私钥客户端保存、公钥服务端保存,禁止网络传输。
步骤2:提取关键信息
提取业务参数、签名值、时间戳(防重放)、随机数(防重放)。
步骤3:前置校验(快速拦截异常)
- 时间戳校验:差值超有效窗口(如5分钟)拒绝;
- 随机数校验:缓存记录,重复则拒绝;
- 参数校验:检查完整性和格式,异常则拒绝。
步骤4:核心验签与结果处理
- 按约定规则重新生成签名;
- 比对签名,建议统一大小写;
- 一致则执行业务并缓存随机数,不一致则返回验签失败(不泄露原因)。
四、实战避坑要点
- 密钥不可泄露、需一致,禁止硬编码,建议存入配置中心;
- 客户端与服务端加签规则(排序、算法等)必须同步;
- 需加时间戳+随机数,防范重放攻击;
- 加签前标准化参数,避免编码、换行符干扰;
- 验签遵循“快速失败”,前置校验失败直接终止。