App开放接口api安全性的设计与实现
前言
在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,
那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目中,大多数采用保存的session中,
然后在存一份到cookie中,来保持用户的回话有效性。但是在app提供的开放接口中,后端服务器在用户登录后如何去验证和维护用户的登陆有效性呢?
设计
对于敏感的api接口,需使用https协议
https是在http超文本传输协议加入SSL层,它在网络间通信是加密的,所以需要加密证书。https协议需要ca证书,一般需要交费。
1、原理
用户登录后向服务器提供用户认证信息(如账户和密码),服务器认证完后给客户端返回一个PID令牌,用户再次获取信息时,
带上此令牌,如果令牌正取,则返回数据。对于获取Token信息后,访问用户相关接口,客户端请求的url需要带上如下参数:
① 时间戳:timestamp
② PID令牌:PID(在这我们给定义为PID)
然后将所有用户请求的参数(包括timestamp,pid),然后更具MD5加密(可以加点盐),生成动态的url。
然后登陆后每次调用用户信息时,带上timestamp,pid参数。
加上时间戳和pid后的URL:http://127.0.0.1:8888/index?pid=d073dae99f70b0cda2fa1ef8d25c527f|1475117419.5424652|0
就变成一个动态的而且相对的具有高安全的,保证数据安全的访问。
2、具体实现
1. api请求客户端想服务器端一次发送用用户认证信息(用户名和密码),服务器端请求到改请求后,验证用户信息是否正确。
如果正确:则返回一个唯一不重复的字符串,然后在Redis(任意缓存服务器)中维护这个用户信息关系,以便其他api对pid的校验。
如果错误:则返回错误码。
2.服务器设计一个url请求拦截规则
①判断是否包含timestamp,pid参数,如果不含有返回错误码。 ②根据用户请求的url参数,服务器端按照同样的规则生成动态的URL,对比请求的动态url与服务端生成的是否相等,相等则放行允许访问。 ③判断服务器接到请求的时间和参数中的时间戳是否相差很长一段时间(时间自定义如十秒),如果超过则说明该url已经过期。 ④记录下每次请求的动态URL,规定一个动态的URL只能访问一次,检测每次请求的url是否请求过,去过存在就返回错误代码(处理url被拦截并且在十秒内请求的访问)。 ⑤此url拦截只需对获取身份认证的url放行(如登陆url),剩余所有的url都需拦截。
3.定期处理保存下来的动态请求URL
代码实现
服务端规定的规则
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
import hashlib
import time access_record = [] # 创建第一次登录过URL列表 PID_LIST = [ # pid列表
'qwe',
'ioui',
'234s',
] class MainHandler(tornado.web.RequestHandler):
def get(self):
# 获取url中全部数据
pid = self.get_argument('pid', None)
# 获取变量
m5, client_time, i = pid.split('|') # 获得数据,以“|”分割开
print(m5, client_time, i)
server_time = time.time() # 服务端的当前时间
# 时间超过10s禁止
if server_time > float(client_time) + 10: # 服务端的当前时间大于客户端当前时间加10秒,表示过期不允许访问
self.write('gun')
return
# 处理10s内容重复的请求
if pid in access_record: # 如果客户端请求的动态URL在第一次登录过的URL列表中
self.write('gun')
return
access_record.append(pid) # 允许通过的url添加到列表中 pid = PID_LIST[int(i)] # 获得客户端发来的pid后面携带的数字
ramdom_str = "%s|%s" % (pid, client_time) # 把客户的pid与当前时间戳拼接
h = hashlib.md5() # MD5加密值
h.update(bytes(ramdom_str, encoding='utf-8')) # 把客户的pid与当前时间戳拼接一个字符串再尽心md5加密
server_m5 = h.hexdigest() # 服务端生成的动态URL
# print(m5,server_m5)
if m5 == server_m5: # 客户生成的与服务端生成的进行对比
self.write("Hello, world")
else:
self.write('gun') application = tornado.web.Application([
(r"/index", MainHandler),
]) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
客户端按规则生成符合的
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import requests
import hashlib PID = 'qwe' # 客户的PID current_time = time.time() # 当前时间戳
ramdom_str = "%s|%s" % (PID, current_time) # 把pid与当前时间戳拼接成一个字符串
h = hashlib.md5() # md5加密
h.update(bytes(ramdom_str, encoding='utf-8')) # 把pid与当前时间戳拼接成一个字符串再进行md5加密
UID = h.hexdigest() # 加密后的字符串 q = "%s|%s|0" % (UID, current_time) # 在把这个字符串后面拼接一个数值 0
url = 'http://127.0.0.1:8888/index?pid=%s' % q # 生成最后生成的动态url
print(url)
ret = requests.get(url)
print(ret.text)
测试效果代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests ret = requests.get('http://127.0.0.1:8888/index?pid=c2539948caa7b7fe0d00fcd9d75b7574|1474341577.4938722|0')
print(ret.text)
这是比较粗超的API认证机制,可以初步了解。
App开放接口api安全性的设计与实现的更多相关文章
- 【转】App开放接口api安全性—Token签名sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- App开放接口api安全性—Token签名sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- App开放接口API安全性 — Token签名sign的设计与实现
在app开放接口API的设计中,避免不了的就是安全性问题. 一.https协议 对于一些敏感的API接口,需要使用https协议. https是在http超文本传输协议加入SSL层,它在网络间通信是加 ...
- APP开放接口API安全性——Token令牌Sign签名的设计与实现
在APP开放接口API的设计中,避免不了的就是安全性问题. 一.https协议 对于一些敏感的API接口,需要使用https协议.https是在http超文本传输协议加入SSL层,它在网络间通信是加密 ...
- App开放接口API安全性之Token签名Sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- 访问API安全性认证设计
1.用户POST登录(账号+密码) | |成功 |2.返回(Private key+时间戳)加密字符串+用户信息+缓存到内存中 | |发起其它请求 |3.发起请求时携带Request参数和(Reque ...
- 开放接口/RESTful/Api服务的设计和安全方案详解
一.总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名 ...
- 开放接口/RESTful/Api服务的设计和安全方案
总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) ...
- 开放数据接口 API 简介与使用场景、调用方法
此文章对开放数据接口 API 进行了功能介绍.使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用. 在给大家分享的一系列软件开发视频课程中,以及在我们的社区微信群聊天中,都积极地鼓励大家开 ...
随机推荐
- HttpURlconntiuon获取网络数据
package Network; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream ...
- 11个提问频率最高的PHP面试题
问题:请用最简单的语言告诉我PHP是什么? 回答:PHP全称:Hypertext Preprocessor,是一种用来开发动态网站的服务器脚本语言. 问题:什么是MVC? 回答:MVC由Model(模 ...
- [NOIP2014]寻找道路(图论)
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- rem 与 px 手机页面自适应
rem相对于根元素html的,em相对于父元素的.rem和em相对大小的值默认情况下如果你没有在根元素指定参照值,那浏览器默认就是 1rem 为 16px,如果你指定了值假设为 20px,那 1rem ...
- HDU 5937 Equation
题意: 有1~9数字各有a1, a2, -, a9个, 有无穷多的+和=. 问只用这些数字, 最多能组成多少个不同的等式x+y=z, 其中x,y,z∈[1,9]. 等式中只要有一个数字不一样 就是不一 ...
- Base64加密与MD5的区别?
MD5是一种不可逆的摘要算法.而Base64是一种编码方式,主要用于将二进制数据转换为文本数据,方便使用HTTP协议等,是可逆的.无论多少二进制数据,在MD5算法一定的情况下,都会变成一个定长的数据, ...
- Vector 和 ArrayList 区别
1.Vector是多线程安全的,而ArrayList不是,如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些:Vector是旧的,是java一诞生就提供了的 ...
- 如何在IDEA 中使用Git
1,下载最新的 git 包 地址: https://git-scm.com/download/win 下载便携版 64,32 根据个人爱好 2,解压后随便放个位置即可,例如图: (不太建议使用它自 ...
- ionic 常见问题
1.Couldn't find ionic.config.json file. ? a.在C:\Users\(Username)\.ionic目录下有ionic.config这个文件 添加后缀名jso ...
- Android应用开发-网络编程(一)(重制版)
网络图片查看器 1. 确定图片的网址 2. 发送http请求 URL url = new URL(address); // 获取客户端和服务器的连接对象,此时还没有建立连接 HttpURLConnec ...