Java中的接口签名,如何使用接口签名来保证API接口安全

本篇的内容是针对 接口签名 的,主要分为什么是接口签名、怎么实现接口签名 以及 怎么用等三个方面的内容!

1. 为什么要接口签名

如何保证 API 接口的安全:在实际的业务开发过程中,经常需要跟第三方 API 对接,那这个时候应该如何设计并保证 API 接口的安全呢?----> 接口签名

2. 什么是接口签名

接口签名: 顾名思义就是通过一些签名的规则,对参数进行签名,然后把签名的信息放在请求头里面。服务端收到客户端的请求之后,同样按照一定的规则,生产对应的签名串,然后跟客户端的签名串进行对比,如果一致就进入业务处理;否则提示签名验证失败。

在这里插入图片描述

  • appId 表示应用的 ID,与之匹配的是 App Secret(应用的密钥,用于数据的签名加密),不同的对接项目,分配不同的 App
    ID 和 App Secret,保证数据的安全;
  • timestamp 表示时间戳,当请求的时间戳和服务器中的时间戳差距在5分钟之内有效;
  • nonce 表示临时的流水号,用于防止重复提交
  • signature 表示签名字段,用于判断接口请求是否有效

3. 关键代码实现

3.1 过滤器相关

1、首先定义过滤器类,如下:

// Spring Boot保证接口安全
public class SignFilter implements Filter {
   
   

    @Resource
    private RedisUtil redisUtil;

    // 从filter配置中获取sign过期时间
    private Long signMaxTime;

    private static final String NONCE_KEY = "x-nonce-";

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
   
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;

        // 返回完整的URL
        System.out.println(httpRequest.getRequestURI());

        // 拿到封装后的Request
        CacheBodyHttpServletRequest requestWrapper = new CacheBodyHttpServletRequest(httpRequest);

        // 构建请求头
        RequestHeader requestHeader = new RequestHeader();

        requestHeader.setSign(httpRequest.getHeader("X-Sign"));
        requestHeader.setNonce(httpRequest.getHeader("X-Nonce"));

        String xTime = httpRequest.getHeader("X-Time");
        // X-Time为空
        if (StringUtils.isEmpty(xTime)) {
   
   
            this.responseFail(httpResponse, ReturnCode.ILLEGAL_HEADER);
            return;
        }
        // 不为空
        requestHeader.setTimestamp(Long.parseLong(xTime));

        // 验证请求头是否存在
        if (StringUtils.isEmpty(requestHeader.getSign()) || ObjectUtils.isEmpty(requestHeader.getTimestamp()) || 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学鸡!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值