点击上方蓝色“方志朋”,选择“设为星标”回复“666”获取独家整理的学习资料!

来源:cnblogs.com/whcghost/p/5657594.html

前言

在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些 接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目 中,大多数采用保存的session中,然后在存一份到cookie中,来保持用户的回话有效性。

但是在app提供的开放接口中,后端服务器在用户登录后 如何去验证和维护用户的登陆有效性呢,以下是参考项目中设计的解决方案,其原理和大多数开放接口安全验证一样,如淘宝的开放接口token验证,微信开发 平台token验证都是同理。

对于敏感的api接口,需使用https协议

https是在http超文本传输协议加入SSL层,它在网络间通信是加密的,所以需要加密证书。

https协议需要ca证书,一般需要交费。

签名的设计

原理: 用户登录后向服务器提供用户认证信息(如账户和密码),服务器认证完后给客户端返回一个Token令牌,用户再次获取信息时,带上此令牌,如果令牌正取,则返回数据。对于获取Token信息后,访问用户相关接口,客户端请求的url需要带上如下参数:

时间戳: timestamp

Token令牌: token

然后将所有用户请求的参数按照字母排序(包括timestamp,token),然后更具MD5加密(可以加点盐),全部大写,生成sign签名,这就是 所说的url签名算法。然后登陆后每次调用用户信息时,带上sign,timestamp,token参数。

例如:原请求https://www.andy.cn/api/user/update/info.shtml?city=北京 (post和get都一样,对所有参数排序加密)

加上时间戳和token

https://www.andy.cn/api/user/update/info.shtml?city=北京×tamp=12445323134&token=wefkfjdskfjewfjkjfdfnc

然后更具url参数生成sign

最终的请求如

https://www.andy.cn /api/user/update/info.shtml?city=北京×tamp=12445323134& token=wefkfjdskfjewfjkjfdfnc&sign=FDK2434JKJFD334FDF2

其最终的原理是减小明文的暴露次数;保证数据安全的访问。

具体实现如下:

1. api请求客户端想服务器端一次发送用用户认证信息(用户名和密码),服务器端请求到改请求后,验证用户信息是否正确。

如果正确:则返回一个唯一不重复的字符串(一般为UUID),然后在Redis(任意缓存服务器)中维护Token----Uid的用户信息关系,以便其他api对token的校验。

如果错误:则返回错误码。

2.服务器设计一个url请求拦截规则

(1)判断是否包含timestamp,token,sign参数,如果不含有返回错误码。

(2)判断服务器接到请求的时间和参数中的时间戳是否相差很长一段时间(时间自定义如半个小时),如果超过则说明该 url已经过期(如果url被盗,他改变了时间戳,但是会导致sign签名不相等)。

(3)判断token是否有效,根据请求过来的token,查询redis缓存中的uid,如果获取不到这说明该token已过期。

(4)根据用户请求的url参数,服务器端按照同样的规则生成sign签名,对比签名看是否相等,相等则放行。(自然url签名 也无法100%保证其安全,也可以通过公钥AES对数据和url加密,但这样如果无法确保公钥丢失,所以签名只是很大程 度上保证安全)。

(5)此url拦截只需对获取身份认证的url放行(如登陆url),剩余所有的url都需拦截。

3.Token和Uid关系维护

对于用户登录我们需要创建token--uid的关系,用户退出时需要需删除token--uid的关系。

签名实现

获取全部请求参数

String sign = request.getParameter("sign");Enumeration<?> pNames =  request.getParameterNames();Map<String, Object> params = new HashMap<String, Object>();while (pNames.hasMoreElements()) {String pName = (String) pNames.nextElement();if("sign".equals(pName))continue;Object pValue = request.getParameter(pName);params.put(pName, pValue);}

生成签名

public static String createSign(Map<String, String> params, boolean encode)throws UnsupportedEncodingException {Set<String> keysSet = params.keySet();Object[] keys = keysSet.toArray();Arrays.sort(keys);StringBuffer temp = new StringBuffer();boolean first = true;for (Object key : keys) {if (first) {first = false;} else {temp.append("&");}temp.append(key).append("=");Object value = params.get(key);String valueString = "";if (null != value) {valueString = String.valueOf(value);}if (encode) {temp.append(URLEncoder.encode(valueString, "UTF-8"));} else {temp.append(valueString);}}return MD5Utils.getMD5(temp.toString()).toUpperCase();}
昨晚逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。
关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷LeetCode算法题后整理的数百道题,每道题均附有详细题解过程。很多人表示刷数据结构和算法题效率不高,甚是痛苦。有了这个笔记的总结,对校招和社招的算法刷题帮助之大不言而喻,果断收藏了。
需要刷题笔记PDF文档的小伙伴可以直接长按扫码关注下方二维码,回复 「刷题笔记」 四个字自取:
关注下方公众号
????????????回复关键字「刷题笔记」,即可下载
笔记版权归原作者所有,转载请注明出处 https://books.halfrost.com/leetcode/

App开放接口api安全:Token签名sign的设计与实现相关推荐

  1. 开放接口API安全性

    服务端对外开放API接口,尤其对移动应用开放接口的时候,更需要关注接口安全性的问题,要确保应用APP与API之间的安全通信,防止数据被恶意篡改等攻击. 安全考量点 Token机制 开放接口时最基本需要 ...

  2. python api接口 安全_App开放接口api安全性的设计与实现

    前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证, 那么这就需要用户提供一些信息,比如用户名密码等 ...

  3. 开放接口API(开发者的福利)

    作为软件开发者来说,没事做点小东西,或者学习的时候做一个练手的小项目,比如:做小程序,app,前段项目等等. 这种难免会需要接口的配合,但是既要做前端又要做后台接口开发,难免有时间和能力的缺陷,怎么才 ...

  4. 帝国CMS手机APP服务器端接口API

    帝国CMS手机APP服务器端接口API 100个左右接口详细请看:https://www.guiboweb.com/appapi.html 使用说明 . 使用示例 (demo) . 安全验证 (sec ...

  5. Java—通过sign签名认证实现安全的开放接口API

    关注微信公众号:CodingTechWork,一起学习进步. 文章目录 引言 API接口 timestamp保证唯一性 shell生成timestamp java生成timestamp模板 sign签 ...

  6. 巴士电台开放接口API

    巴士电台(Bus.Fm)是跟落网站长和朋友们一起开发的一个在线电台,非商业运营,目前已稳定运行几个月,考虑到我们人手不够,因为赶制了开放接口出来,希望有心的网友来加入制作各种好玩的应用在各大平台上面, ...

  7. app开放接口签名设计与实现

    只要接口暴露在外网,就避免不了安全问题.如果让接口裸奔,其他人只要知道接口地址和参数就可以调用,那简直就是灾难.试想有一个发送注册验证码的接口,如果仅仅知道接口地址和参数(手机号)就可以调用,那短信接 ...

  8. 获取网易云音乐开放接口api的推荐歌单

    网易云音乐开放api接口 网址:https://binaryify.github.io/NeteaseCloudMusicApi/#/?id=neteasecloudmusicapi 项目地址:htt ...

  9. android 接口sign,[原创]小米APP登录接口env、envkey、sign、hash算法

    0x00前言 最近大家都在抢茅台酒,我也来凑凑热闹,我也好想抢到一瓶~,上次也发过一个酒仙APP的分析帖子了 上次分析贴:这次正好又碰到了一个小米有品的登录接口,碰到有好几个加密的数据,这次我们继续本 ...

最新文章

  1. 11、MySQL字符集和校对规则详解
  2. LSI SAS 3108 配置操作
  3. linux 备份svn
  4. 哪个银行的大额存款门槛最低?5万能买大额存单吗?
  5. django配置templates、static、media和连接mysql数据库
  6. nssl1248-B【点分治,平衡树】
  7. nios pio interrupt 的使能
  8. html box 竖线,CSS3 小竖条脉冲型LOADING动效
  9. C#学习笔记——委托机制
  10. html5新增graph,Qunee for HTML5
  11. python新闻联播分类_如何利用人脸识别自动切分视频
  12. Linux小知识收集(不断更新)
  13. vs2010中使用Nunit测试c#代码结果的正确性
  14. EWSA1.50.0.298栈溢出错误
  15. IDEA 不检查语法错误问题
  16. C++STL算法 find_first_of根据梁山好汉的姓名长度进行查找
  17. C语言游戏设计——扫雷
  18. PNP NPN 三线制接近开关接线
  19. vue打印插件的使用
  20. 入门,前后端实现简单账号密码登录

热门文章

  1. 2018/8/24阅读文献 A Unified Model for Multi-Objective Evolutionary Algorithms with Elitism
  2. 2018-3-2线性表
  3. 超级挂载 实现过程-代码
  4. chosen.jquery.js 有搜索功能、多选功能的下拉框插件
  5. scala学习笔记-过程、lazy值和异常(6)
  6. 模板引擎:VelocityFreeMarker(转)
  7. JS 实现可停顿的垂直滚动
  8. C# 文件操作(上传 下载 删除 文件列表...)
  9. 学编程必看:逻辑思维测试
  10. 基于Matlab的BP神经网络在语音特征信号识别中的应用