一、接口加密
前后端数据接口,或者对端server接口等等应用场景
目前节点和管理端双向都有通信,均使用HTTP协议、POST请求,这里分别对请求体和回复体都进行AES-CBC加密
双方约定使用一个固定的iv:xxxx
key的生成算法如下:
其中 nodeBytes 是节点ID的使用大端的字节数组,randKey是使用 crypto/rand 生成的16位随机字节数组
请求步骤:
发送方根据节点ID生成key,对请求体进行AES加密,发送给接收端
接收端收到请求后,根据节点ID生成key,进行数据解密
处理业务逻辑
接收端回复加密后的数据
发送方解密数据,获取响应
注意:
同一个请求回复,使用的NodeID应该是同一个
如果请求体为空,则body只有节点ID的字节数组
二、防重放
利用 redis 记录一个请求 key 来防止重放问题。步骤如下:
管理端向 redis 写入本次请求的 key,redis value 则是目标节点的 id,并设置超时时间
管理端向 agent 发起请求,并在 http/header 中携带该配置 key
agent 接收到请求后,通过 header 携带的 key,从 redis 中获取值,判断值是否是节点自己的 id
请求处理完成后删除该 key
为什么不用签名?
使用签名之后,可以对请求的身份进行验证。但不能阻止重放攻击,即攻击者截获请求后,不对请求进行任何调整。直接使用截获的内容重新高频率发送请求。