说说API的防重放机制

简介:

说说API的防重放机制

我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击。重放攻击是什么呢?就是把你的请求原封不动地再发送一次,两次...n次,一般正常的请求都会通过验证进入到正常逻辑中,如果这个正常逻辑是插入数据库操作,那么一旦插入数据库的语句写的不好,就有可能出现多条重复的数据。一旦是比较慢的查询操作,就可能导致数据库堵住等情况。

这里就有一种防重放的机制来做请求验证。

timestamp+nonce

我们常用的防止重放的机制是使用timestamp和nonce来做的重放机制。

timestamp用来表示请求的当前时间戳,这个时间戳当然要和服务器时间戳进行校正过的。我们预期正常请求带的timestamp参数会是不同的(预期是正常的人每秒至多只会做一个操作)。每个请求带的时间戳不能和当前时间超过一定规定的时间。比如60s。这样,这个请求即使被截取了,你也只能在60s内进行重放攻击。过期失效。

但是这样也是不够的,还有给攻击者60s的时间。所以我们就需要使用一个nonce,随机数。

nonce是由客户端根据足够随机的情况生成的,比如 md5(timestamp+rand(0, 1000)); 它就有一个要求,正常情况下,在短时间内(比如60s)连续生成两个相同nonce的情况几乎为0。

服务端

服务端第一次在接收到这个nonce的时候做下面行为:
1 去redis中查找是否有key为nonce:{nonce}的string
2 如果没有,则创建这个key,把这个key失效的时间和验证timestamp失效的时间一致,比如是60s。
3 如果有,说明这个key在60s内已经被使用了,那么这个请求就可以判断为重放请求。

示例

那么比如,下面这个请求:

http://a.com?uid=123&timestamp=1480556543&nonce=43f34f33&sign=80b886d71449cb33355d017893720666

这个请求中国的uid是我们真正需要传递的有意义的参数

timestamp,nonce,sign都是为了签名和防重放使用。

timestamp是发送接口的时间,nonce是随机串,sign是对uid,timestamp,nonce(对于一些rest风格的api,我建议也把url放入sign签名)。签名的方法可以是md5({秘要}key1=val1&key2=val2&key3=val3...)

服务端接到这个请求:
1 先验证sign签名是否合理,证明请求参数没有被中途篡改
2 再验证timestamp是否过期,证明请求是在最近60s被发出的
3 最后验证nonce是否已经有了,证明这个请求不是60s内的重放请求


本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/6590890.html,如需转载请自行联系原作者


相关文章
|
4月前
|
JSON 前端开发 生物认证
REST API 的指纹验证机制
REST API 的指纹验证机制
30 0
|
Java
Java常用API---Runtime(消息机制)含代码例子
私有化构造方法,不能被实例化
139 0
Java常用API---Runtime(消息机制)含代码例子
|
Java API
Java反射机制API
反射(Reflection)是程序的自我分析能力,通过反射可以确定类有哪些方法、有哪些构造方法以及有 哪些成员变量。Java语言提供了反射机制,通过反射机制能够动态读取一个类的信息;能够在运行时 动态加载类,而不是在编译期。反射可以应用于框架开发,它能够从配置文件中读取配置信息动态加 载类、创建对象,以及调用方法和成员变量。
|
监控 安全 Java
SpringCloud安全实战(一)-API及其安全机制
SpringCloud安全实战(一)-API及其安全机制
139 0
SpringCloud安全实战(一)-API及其安全机制
|
算法 安全 Java
PolarDB-X 1.0-API参考-1.0(2019版本)-签名机制
为保证API的安全调用,在调用API时阿里云会对每个API请求通过签名(Signature)进行身份验证。无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。
1863 0
|
JSON 算法 Java
PolarDB-X 1.0-API参考-1.0(2017版本)-OpenAPI使用-签名机制
关于 Access Key ID 与 Access Key Secret PolarDB-X 服务会对每个 API 的调用请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含由 Access Key ID 与 Access Key Secret 所产生的签名(Signature)信息。 Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份。 Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串
166 0
|
API Android开发 存储
12.源码阅读(IPC Binder机制-android api 26)
调用bindService方法绑定服务最终会执行Service的onBind方法并在ServiceConnection的onServiceConnected中得到IBinder对象,我们从源码角度看看这一过程是如何进行的 首先从ContextImpl的...
823 0