API安全性
防止被其他人随意调用
- appKey & signKey
- 通过appKey标识不同调用方,利用signKey和传入参数加密生成sign
- 加密方式:
- 通过RSA算法非对称加密,公钥给客户端加密,服务端用私钥解密
- MD5
- JWT & 白名单
- 服务器配置ip白名单
- 用户发送用加密的sign等参数给服务器验证登录,验证通过后返回token
- 客户端保存token,后续在发起请求时,再用signKey加密token
- 服务端加密之后,校验token是否有效,并判断host是否在白名单内
防止请求参数被篡改
- 使用签名算法
根据参数名称的ASCII码表的顺序排序,拼接生成字符串,加上特定的
appSecret,使用签名算法进行摘要, 之后生成固定长度的字符,具体参考淘宝开发平台的签名算法
防止中间人替换返回的结果
- 服务端返回同样的签名,客户端验签
- 客户端按照一定规则生成签名,并把签名所需的参数一起传给服务端,服务端把传过来的参数, 按照客户端那样生成签名,和返回内容一起返回给客户端
- 客户端再校验是否符合规则,符合则说明未被替换
防重放
- timestamp & nonce & sign
- 客户端
timestamp当前时间戳加上约定好的数,用md5加密成随机数
nonce,和sign 发送给服务端 - 服务端
-
先验证sign签名是否合理,证明请求参数没有被中途篡改
-
验证timestamp是否过期,是否在过期时间内发出,验证通过
-
再去缓存redis中查找是否有key为nonce:{nonce}的string
-
如果没有,则创建这个key,把这个key失效的时间和验证timestamp失效的时间一致
-
- 客户端
timestamp当前时间戳加上约定好的数,用md5加密成随机数