使用nonce巩固接口签名安全

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

前面我们有讲过如何进行API的安全控制,其中包括数据加密,接口签名等内容。详细可以参考我下面两篇文章:

-《前后端API交互如何保证数据安全性》

-《再谈前后端API签名安全?》

在签名部分,通过时间戳的方式来判断当前请求是否有效,目的是为了防止接口被多次使用。但是这样并不能保证每次请求都是一次性的,今天给大家介绍下如何保证请求一次性?

首先我们来回顾一些时间戳判断的原理:客户端每次请求时,都需要进行签名操作,签名中会加上signTime参数(当前请求时间戳)。HTTP请求从发出到达服务器的正常时间不会很长,当服务器收到HTTP请求之后,首先进行签名检查,通过之后判断时间戳与当前时间相比较,是否超过了一定的时间,这个时间我们可以自行决定要多长,比如1分钟,2分钟都可以,时间长点可以防止客户端和服务器时间不一致的问题,如果超过了则认为是非法的请求。

假设我们的请求有效期是1分钟,如果黑客得到了我们的请求地址,在1分钟之内是可以重复请求多次的,因为这种方式不能保证请求仅一次有效。

基于nonce的方式可以解决重复使用的问题,最开始知道nonce是在广点通的接口中看到的,如下图所示:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1.png

可以看到腾讯这边的接口也是基于时间戳和nonce来控制的。

nonce是随机字符串,每次请求时都要保证不同,你可以用uuid,可以用别的算法,也可以用随机加时间戳等等,只要不重复就行。

在后端我们验证的时候,将nonce参数存储起来,至于是存储在本地内存中,数据库中,redis,布隆过滤器中这就看你自己的需求了。

处理HTTP请求时,首先判断该请求的nonce参数是否在存在,如果存在则认为是非法请求。如果不存在则是合法请求,让后将该nonce存储起来,防止下次重复使用。

这种方式的弊端也很明显,那就是nonce的存储会越来越大,验证nonce是否存在的时间会越来越长。

如何解决存储问题?

可以用时间戳+nonce同时使用,相互配合,取长补短。

首先我们根据时间戳判断是否超过了一定的时间范围,如果超过了就直接拒绝,没有超过继续验证nonce是否使用过。

nonce没使用,存储起来,记录一个存储时间,通过定时任务去清除超过了时间戳验证的时间的nonce。这样的话我们只需要存储固定时间内的nonce数据,因为时间长的已经被时间戳的判断给拦截了,nonce的验证只需要验证时间有效期内的即可。

伪代码如下:

// 1.1获取签名时间,跟当前时间做对比,判断是否超出范围
Long signTime = 1XXXXL;
Long curTime = System.currentTimeMillis();
if (curTime - signTime > 60000) {
    // 超出了
    return;
}

// 1.2获取nonce判断是否存在,以redis举例
String nonce = "XXXXXX";
if (redisTemplate.hasKey(nonce)){
    //已经使用过了
else {
    //没有使用,存储起来,设置过期时间为当前访问时间+判断请求过期的时间
    //这样就不用定时任务去清除之前的nonce,利用redis自动清除
   redisTemplate.opsForValue().set(nonce, ""1, TimeUnit.MINUTES);
}


原文发布时间为:2018-12-03 本文作者:尹吉欢 本文来自云栖社区合作伙伴“猿天地”,了解相关信息可以关注“ 猿天地 ”。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
Java Windows
签名验签工具
我们提供了一键生成RSA密钥工具。该工具也提供了签名及验签功能,可以演示针对支付宝开放平台接口的签名和验签流程。 WINDOWS版本下载地址:WINDOWS MAC OS版本下载地址:MAC_OSX 解压后,WINDOWS版本双击文件“RSA签名验签工具.bat”即可运行工具。
3939 0
|
8月前
|
安全 Java 开发工具
apk加固后再签名
apk加固后再签名
|
9月前
|
XML 存储 安全
CodeSign的签名机制
iOS如何保证App的安全
288 1
|
9月前
|
数据安全/隐私保护
加密与签名的区别
加密与签名的区别
60 0
|
Java 程序员 数据安全/隐私保护
Java接口签名(Signature)实现方案
针对当前的系统开发一个对外开放的接口
|
文字识别 安全 Java
阿里云请求签名Java实现
为保证API的安全调用,在调用API时阿里云会对每个API请求通过签名(Signature)进行身份验证。无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。在使用阿里云文字识别ocr时,看到官网提供了Python的构造签名示例,此篇文章就以官网提供的参数以Java方式构造下签名
1227 1
阿里云请求签名Java实现
给apk去签名、重新签名
给apk去签名、重新签名
165 0
给apk去签名、重新签名
C#编程:方法签名-8
C#编程:方法签名-8
138 0
|
存储 Java 开发工具
AndroidV1,V2,V3签名原理详解
AndroidV1,V2,V3签名原理详解
228 0
AndroidV1,V2,V3签名原理详解
|
前端开发 安全 NoSQL
API 接口的安全设计验证:ticket,签名,时间戳
概述 与前端对接的API接口,如果被第三方抓包并进行恶意篡改参数,可能会导致数据泄露,甚至会被篡改数据,我主要围绕时间戳,token,签名三个部分来保证API接口的安全性
API 接口的安全设计验证:ticket,签名,时间戳