接口的安全设计的几大要素:ticket,签名,时间戳

概述

与前端对接的API接口,如果被第三方抓包并进行恶意篡改参数,可能会导致数据泄露,甚至会被篡改数据,我主要围绕时间戳,token,签名三个部分来保证API接口的安全性

968e187655d70e807a6aaca1266153df.jpeg

1.用户成功登陆站点后,服务器会返回一个token,用户的任何操作都必须带了这个参数,可以将这个参数直接放到header里。

2.客户端用需要发送的参数和token生成一个签名sign,作为参数一起发送给服务端,服务端在用同样的方法生成sign进行检查是否被篡改。

3.但这依然存在问题,可能会被进行恶意无限制访问,这时我们需要引入一个时间戳参数,如果超时即是无效的。

4.服务端需要对token,签名,时间戳进行验证,只有token有效,时间戳未超时,签名有效才能被放行。

开放接口

没有进行任何限制,简单粗暴的访问方式,这样的接口方式一般在开放的应用平台,查天气,查快递,只要你输入正确对应的参数调用,即可获取到自己需要的信息,我们可以任意修改参数值。

/*
 * Description: 开放的接口
 * @author huangweicheng
 * @date 2020/12/21
*/
@RestController
@RequestMapping( "/token")
public  class  TokenSignController {

     @Autowired
     private TokenSignService tokenSignService;

     @RequestMapping(value =  "openDemo",method = RequestMethod.GET)
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;List<PersonEntity>&nbsp; openDemo( int&nbsp;personId){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;tokenSignService.getPersonList(personId);
&nbsp;&nbsp;&nbsp;&nbsp;}
}

Token认证获取

用户登录成功后,会获取一个ticket值,接下去任何接口的访问都需要这个参数。我们把它放置在redis内,有效期为10分钟,在ticket即将超时,无感知续命。延长使用时间,如果用户在一段时间内没进行任何操作,就需要重新登录系统。扩展:

@RequestMapping(value&nbsp;=&nbsp; "login",method&nbsp;=&nbsp;RequestMethod.POST)
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;JSONObject&nbsp; login(@NotNull&nbsp;String&nbsp;username,&nbsp;@NotNull&nbsp;String&nbsp;password){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;tokenSignService.login(username,password);
&nbsp;&nbsp;&nbsp;&nbsp;}

登录操作,查看是否有这个用户,用户名和密码匹配即可成功登录。

/**&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Description:验证登录,ticket成功后放置缓存中,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; @param
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; @author&nbsp;huangweicheng
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; @date&nbsp;2020/12/31&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;JSONObject&nbsp; login(String&nbsp;username,String&nbsp;password){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;result&nbsp;=&nbsp; new&nbsp;JSONObject();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PersonEntity&nbsp;personEntity&nbsp;=&nbsp;personDao.findByLoginName(username);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(personEntity&nbsp;==&nbsp; null&nbsp;||&nbsp;(personEntity&nbsp;!=&nbsp; null&nbsp;&&&nbsp;!personEntity.getPassword().equals(password))){
&nbsp;&nbsp;&n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值