服务间远程请求

防篡改

MD5 与 SHA-256 同为确定性哈希函数,都用于生成数据指纹;两者都具备雪崩效应与固定长度输出。区别在于 MD5 存在可被主动构造的碰撞,已不具备安全性,而 SHA-256 具备强抗碰撞能力,当前仍安全,适用于签名与防篡改等安全场景。

雪崩效应是指:内容一旦被改,指纹就会变化;

MD5主动碰撞是指:不同的内容可以生成相同的MD5指纹,这就导致攻击者可能构造出与目标内容相同的MD5,从而越过目标系统的防篡改验证;

SHA-256 在数学上也可能碰撞,但碰撞可能需要100 亿年以上,因此在工程上等价于不会碰撞,可用于安全场景,而 MD5 已经不具备这个性质。


服务间请求

客户端发起 POST 请求时,会先对请求体进行序列化与规范化(如字段排序、编码统一等),以保证同一语义的数据在客户端与服务端具有一致的字节表示。

在微服务间调用中,请求体完成规范化后,客户端通过 SHA-256 计算得到请求体的 hash,并将该 hash 与请求路径、HTTP 方法、时间戳、随机数等按照约定规则拼接,使用加密密钥通过 HMAC-SHA256 生成数字签名;随后将签名、相关请求头以及原始 body 一并发送至服务端。

服务端接收到请求后,按相同规则对请求体进行规范化并重新计算 hash,再基于加密密钥生成签名,与请求头中的签名进行比对;若签名一致,则说明请求体未被篡改且来源可信,否则判定为非法请求。同时结合时间戳与随机数校验,可进一步防止重放攻击;当请求体为空时,约定对空字节序列进行 hash 计算,其结果为固定值,从而保证签名流程的一致性与无分支处理。


请求信任

服务之间发起请求时,要加如下请求头:

X-Remote-Call : 用于区分普通请求

X-Client-Id : 用于标识请求方的身份

X-Timestamp : 请求发起时的时间戳,可用于防止防重放攻击;例如:服务端收到请求后,发现此时间与当前时间相关较远(一般是5分钟),可以直接拒绝请求;

X-Nonce : 一次性随机数,防止重复请求 和 重放攻击

X-Signature : 请求的数字签名,用于校验请求参数是否被被篡改、来源是否可信;


请求一次性性消费

请求体只能被读取一次,这是 Servlet 规范对 HTTP 输入流的设计(基于一次性消费的 InputStream);但在微服务远程调用场景中,服务端通常需要在过滤器中先读取请求体以完成签名验证(如计算 SHA-256 并校验签名),此时请求流已被消费,后续 Controller 将无法再次读取请求体;因此需要通过 SignedRequestWrapper 将已读取的请求体缓存到内存中,并重写 getInputStream()getReader() 方法,使请求体可以被重复读取,从而既满足安全校验,又不影响后续业务处理。


过滤器顺序和鉴权链路

过滤器的顺序

鉴权链路

在 Controller 中通过注解声明可被访问性








举报

© 著作权归作者所有


0