需求概述
客户端信道早在1.1版本中便实现了服务器防重放攻击功能,但始终没有实现客户端防重放攻击。这样会使得客户端存在被重放攻击的危险,如用户在转账时被重放了转账失败页面,导致用户重复转账。 为此,我们需要在客户端信道中实现客户端防重放功能。
功能需求
我们需要实现以下需求:
- 在服务器响应中增加序列号,实现客户端防重放功能
- 兼容之前版本的信道通信,以便在升级服务器后,可以兼容旧客户端。
设计
为兼容旧版本信道协议,我们需要新增1.5版本协议来实现客户端防重放功能。1.5信道协议在1.4协议基础上进行升级。
防重放逻辑
- 在服务器响应报文的前面增加组别和防重放序列号。
- 格式与请求序列号格式相同,即组别(1位byte) + 序列号(8位byte) + 响应内容。
- 由于从1.4版本后摘要值添加在响应内容前,因此1.5版本需要将摘要值添加在序列号之前,即摘要 + 组别 + 序列号 + 响应内容。
- 客户端收到响应后先解析组别和序列号,并与本地同组别的请求序列号进行比较,验证序列号合法性。如果请求序列号与响应序列号相同则视为合法,合法再处理校验摘要值及响应内容,如果非法则提示网络错误。其中网络错误提示信息可配置。
- 会话超时时,服务器统一返回20位byte(全是0)数据,不分国密非国密。
序列号生成逻辑
- 响应序列号生成的规则为:与本次客户端请求序列号相同。
- 由于服务器本地可以获取到当前请求对应的请求序列号,因此响应序列号只需使用该值即可。
响应hamc校验摘要值计算
- 由于序列号作为响应内容的一部分,因此摘要需要以加入序列号之后的响应内容来计算。即摘要值 = 对(组别 + 序列号 + 响应内容)做hamc加密。
- 国密加密模式下摘要值为32位byte,非国密模式下摘要值为20位byte。
HTTP防重放逻辑
修改接口ewp_ssl:ssl_sign/2处理逻辑:
- 修改摘要值的计算方法
- 响应报文修改为:摘要 + 组别 + 序列号 + 响应内容
TCP防重放逻辑
修改接口ewp_ssl:ssl_sign/2处理逻辑:
- 修改摘要值的计算方法
- 响应报文修改为:{tcp, 摘要, 组别 + 序列号, 响应内容}
- 根据TCP设计文档 4.1.2 TCP接口,服务器响应格式的ResponseMessages,追加Type类型3,表示 组别(1位byte) + 序列号(8位byte),格式为:Type(1 byte) + Length(4 bytes) + Content(Length bytes)。如:<