背景

有一个java应用需要访问python web应用。需要定制一套http调用安全方案,避免数据在传输过程中裸奔。

解决步骤

请求方身份是否合法

a服务要调用b服务,b需要知道a是谁,此处可以使用token/access_token来处理,b服务中配置指定的token,若没有token则拒绝请求,a服务的每个请求都要带token

请求参数是否被篡改

签名,将指定数据进行签名并md5,得到一个sign值,该值和token并列传输。b服务接收到后先生成并校验sign是否一致。不一致则拒绝请求。

请求携带了token和业务数据,业务数据可以使用aes/rsa加密,可以使用token的全部或部分数据参与加密。

重放攻击

sign签名参数虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数多次请求的风险。

时间戳参数

引入timestamp参数,保证接口仅在一定时间如(1分钟)内有效,需要和客户端时间保持一致。

唯一请求id

请求方携带唯一id,b服务处理前先检查是否存在缓存中,存在则拒绝处理,处理该请求后将该唯一id存放到缓存中一段时间(如一天或1小时)。

此方案会占用额外资源(缓存服务)。

设置ip白名单 + 限流

请求方的ip不在白名单中,则直接拒绝服务。

限制请求方每秒可以请求的次数(如100)。

此方案比唯一请求id更合理。

代码

java版

  • md5工具类/rsa工具类

python版

  • md5工具类/rsa工具类

请求参数规范

  • 服务端只提供POST请求(Content-Type: application/json),听起来不合理,但对客户方和服务方都很方便。
  • url请求参数中携带安全参数(token, sign, timestamp)
  • 请求体参数示例 {"sdata": "xxxx"}
    • sdata -> Secret Data
作者:admin  创建时间:2024-10-19 17:14
最后编辑:admin  更新时间:2025-09-19 10:08