当前位置:   article > 正文

springboot项目接口加密_springboot 接口封装 给三方提供接口 加密及相关协议 post

springboot 接口封装 给三方提供接口 加密及相关协议 post

如果是管理后台的开发,可以通过shiro或springSecurity进行权限控制,进而保证API接口的安全性,但是,当我们在进行APP或小程序开发的时候,因为需要用户长期登录等问题,再采用shiro等方式进行安全控制就显得不是那么合理的。

可是,如何让我们的API接口变得安全点?不至于当其他人通过抓包的方式拿到你的userId或一些重要参数的时候,对你的数据进行破坏。

那么,API接口的签名校验,将会是你阻挡这些破坏的一堵墙。

下面,让我们开始API签名校验之旅吧。

基础准备
首先,我们先要了解一下普通的API接口是如何访问的(以POSTMAN为例)。

请求/sign/test接口
下面贴一下代码
@RestController
@RequestMapping(value = “/sign”)
public class SignController {

/**
 * 验签测试
 *
 * @return
 */
@RequestMapping(value = "/test")
public String test(String name) {
    return name;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

}
代码很简洁,无需多言,我想,在没进行签名校验的时候大多数人的代码都是这样的吧。

正式开始
实现效果
1、前端请求方式
我们需要用到的就是,http请求的 header,将token(令牌) 和 timestamp(时间戳)作为参数,一起发送给我们的后端。然后后端对token和timestamp进行校验,校验通过后,才进行的正式访问。

2、后端处理方式
@RestController
@RequestMapping(value = “/sign”)
public class SignController {

/**
 * 验签测试
 *
 * @return
 */
@SignatureValidation
@RequestMapping(value = "/test")
public String test(String name) {
    return name;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

}
是的,你没有看错,就多了一个注解(自定义的,不用去百度什么意思了)。

@SignatureValidation
加上后,看效果

请求被签名拦截了

好了,下面去看怎么实现的吧。

实现原理
1、签名规则
(1)、前后端都要统一一个秘钥(secret),这个秘钥是自己定义的,尽可能复杂点。这个可别泄露哦。
(2)、我们需要准备一个当前时间戳 timeStamp,这个很好获取,要注意的是,这个时间戳最好要精确到毫秒。
(3)、我们要确定自己的加密方式。可以使用MD5进行加密,你想加密几次看心情,让他们猜不出来就行了。
(4)、将秘钥和时间戳拼接字符串,然后通过你们约定的加密方式进行加密,得到TOKEN
伪代码(一次加密为例)

token = MD5(secret+ timeStamp);
思考:如果一个人通过抓包的方式拿到了你的接口(header 中的token 和 timestamp),他如何才能进行破解?

第一:他要知道我们的秘钥(secret),只要你设计的够复杂,靠猜是猜不出来的。
第二:他要知道我们的加密方式,我这里用MD5这种常规加密,你们可以换个加密方式,最好是非对称加密。
第三:他要知道我们的加密次数。
第四:他要知道我们的加密规则

如果不是特别重要的接口或者专门要搞你,大部分会退缩的。当然少部分就会通过反编译你的源码去拿到这些数据,或者意外泄露,那你只能自己去加强相关的防护去呗。混淆文件啦,应用加固啦,用胶带粘住嘴啦,方法很多,自己去慢慢研究。

2、Springboot 实现(大家最喜欢的环节,一步步去复制代码到自己项目中去吧)
1、新建一个文件,定义注解接口
文件位置
package com.xxx.aop;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**

  • @author zhonzq
  • 小程序请求认证
    */
    @Retention(value = RetentionPolicy.RUNTIME)
    public @interface SignatureValidation {
    }
    其中,一定要注意包名(根据你放这个文件位置),这个下面会用到。

package com.xxx.aop;
2、使用aspect进行切点拦截(不知道其实现原理,去百度吧)
文件位置(忽略那个HttpAspect)
@Aspect
@Component
public class SignatureValidation {
/**
* 时间戳请求最小限制(30s)
* 设置的越小,安全系数越高,但是要注意一定的容错性
/
private static final long MAX_REQUEST = 30 * 1000L;
/
*
* 秘钥
*/
private static final long SECRET= “前后端约定的秘钥”;

/**
 * 验签切点(完整的找到设置的文件地址)
 */
@Pointcut("execution(@com.xxx.aop.SignatureValidation * *(..))")
private void verifyUserKey() {
}

/**
 * 开始验签
 */
@Before("verifyUserKey()")
public void doBasicProfiling() {
    HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
    String token = request.getHeader("token");
    String timestamp = request.getHeader("timestamp");
    try {
        Boolean check = checkToken(token, timestamp);
        if (!check) {
          // 自定义异常抛出(开发者自行换成自己的即可)
            throw new MyException(ResultEnums.ERROR, "签名验证错误");
        }
    } catch (Throwable throwable) {
        // 自定义异常抛出(开发者自行换成自己的即可)
        throw new PlbException(ResultEnums.ERROR, "签名验证错误");
    }
}

/**
 * 校验token
 *
 * @param token     签名
 * @param timestamp 时间戳
 * @return 校验结果
 */
private Boolean checkToken(String token, String timestamp) {
    if (StringUtils.isAnyBlank(token, timestamp)) {
        return false;
    }
    long now = System.currentTimeMillis();
    long time = Long.parseLong(timestamp);
    if (now - time > MAX_REQUEST) {
        log.error("时间戳已过期[{}][{}][{}]", now, time, (now - time));
        return false;
    }
    String crypt = MD5Utils.getMD5(SECRET+ timestamp);
    return StringUtils.equals(crypt, token);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

}
下面说一下用到的工具类:
MD5Utils
每个项目里面都有吧,没有的话网上一搜就行了。
StringUtils
其实很简单,自己写也行,引入第三方的也行,我是引用的apache的,你们也可试试。
pom.xml 文件

org.apache.commons commons-lang3 好了,你又没有看错。这样结束了。这样你就有了自己的签名校验工具类,快拿到你的项目中试试去吧。 然后你以后的API接口,只需要加上这个注解就能进行签名验证了。

@SignatureValidation
总结
很多时候,我们在开发中都只关心业务,对安全性的问题很可能就忽略了,其实我们只需要对自己的API接口稍微一处理,有可能就会避免一些安全问题。从而避免一些不必要的损失。好吧,就到这里,安心睡觉去吧

作者:一击必中
链接:https://www.jianshu.com/p/d40b00f4ef87
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/618957
推荐阅读
相关标签
  

闽ICP备14008679号