使用nonce巩固接口签名安全

简介:

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

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

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

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

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

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

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

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 本文作者:尹吉欢 本文来自云栖社区合作伙伴“猿天地”,了解相关信息可以关注“ 猿天地 ”。
相关文章
|
缓存 算法 API
从 0 实现 API 接口签名验证系统:基于 HMAC-SHA256 的防篡改方案(附 Python 全代码)
本文介绍基于 的 API 接口签名验证系统,实现防篡改与防重放攻击,包含完整设计原理、签名生成规则及可运行的 Python 客户端与服务端代码,并提供安全性优化与部署建议。
|
7月前
|
网络安全 文件存储 数据安全/隐私保护
路由器配置 DDNS 实现稳定的远程访问
本文详解家庭内网穿透的极简方案:只需将光猫拨号改为路由器PPPoE拨号,获取公网IP,再搭配DDNS(如花生壳、Cloudflare)绑定固定域名,最后配置端口转发。无需服务器、不依赖中转,零成本、高稳定,轻松实现NAS远程访问、远程桌面、自建服务外网共享等实用场景。
2244 5
|
11月前
|
Web App开发 存储 人工智能
架构剖析:Playwright MCP Server 的工作原理与性能优化最佳实践
本文深入解析Playwright MCP Server架构,涵盖MCP协议、Playwright引擎与会话管理三大核心,结合性能优化与稳定性实践,助力构建高效可靠的AI浏览器自动化应用。
|
API 数据处理 开发者
获取淘宝分类详情:深入解析taobao.cat_get API接口
淘宝开放平台推出的`taobao.cat_get` API接口,帮助开发者和商家获取淘宝、天猫的商品分类详情。该接口支持获取类目列表、属性及父类目信息,通过指定分类ID(cid)实现精准查询,并提供灵活的参数设置和高效的数据处理。使用流程包括注册账号、创建应用、获取App Key/Secret、构造请求、发送并解析响应。示例代码展示了如何用Python调用此API。开发者可借此为电商项目提供数据支持。
|
存储 Java API
SpringBoot整合Flowable【02】- 整合初体验
本文介绍了如何基于Flowable 6.8.1版本搭建工作流项目。首先,根据JDK和Spring Boot版本选择合适的Flowable版本(7.0以下)。接着,通过创建Spring Boot项目并配置依赖,包括Flowable核心依赖、数据库连接等。然后,建立数据库并配置数据源,确保Flowable能自动生成所需的表结构。最后,启动项目测试,确认Flowable成功创建了79张表。文中还简要介绍了这些表的分类和常用表的作用,帮助初学者理解Flowable的工作原理。
4185 0
SpringBoot整合Flowable【02】- 整合初体验
|
SQL 存储 Java
应用成本低出 N 倍的数据分析引擎 esProc SPL
我们介绍的 esProc SPL 是一个数据分析引擎,具备 4 个主要特点:低代码、高性能、轻量级、全功能。SPL 不仅写得简单,跑得也更快,既可以独立使用还能与应用集成嵌入,同时适用于多种应用场景。使用 esProc SPL 实现数据分析业务,整体应用成本将比以 SQL 为代表的传统技术低出几倍。
|
存储 数据采集 算法
数据中台最全详解,一文彻底搞懂!
中台是大型数据架构模式,也是大型架构的必备技能,本篇全面详解数据中台,建议收藏备用。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
数据中台最全详解,一文彻底搞懂!
|
API 数据安全/隐私保护
抖音视频,图集无水印直链解析免费API接口教程
该接口用于解析抖音视频和图集的无水印直链地址。请求地址为 `https://cn.apihz.cn/api/fun/douyin.php`,支持POST或GET请求。请求参数包括用户ID、用户KEY和视频或图集地址。返回参数包括状态码、信息提示、作者昵称、标题、视频地址、封面、图集和类型。示例请求和返回数据详见文档。
7471 1
|
JavaScript Java Apache
【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析
【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析
6984 0
|
移动开发 网络协议 算法
(十)Netty进阶篇:漫谈网络粘包、半包问题、解码器与长连接、心跳机制实战
在前面关于《Netty入门篇》的文章中,咱们已经初步对Netty这个著名的网络框架有了认知,本章的目的则是承接上文,再对Netty中的一些进阶知识进行阐述,毕竟前面的内容中,仅阐述了一些Netty的核心组件,想要真正掌握Netty框架,对于它我们应该具备更为全面的认知。
1517 2