app和后端的通讯过程中,api请求有可能被别人截取或不小心泄露。那么,怎么保证api请求的安全呢?在这篇文章中,介绍一种常见的保证api请求安全的做法--url签名。

1. url签名详解

  在前一篇文章<15.app后端怎么设计用户登录方案>中,服务器中验证用户名和密码都正确后,生成一个随机的不重复的token字符串(例如"daf32da456hfdh"),在redis或memcache中维护一个映视表,建立token字符串和用户信息的对应关系表,例如,把token字符串"daf32da456hfdh"和用户id"5"对应起来,服务器把token字符串返回给app用作身份验证。





  这个身份验证是依赖于token字符串。如果用户泄露了自己的url, 那很大程度上token也被别人泄漏了。





  怎么防止token被泄露?不让token在网络上传输就行。





  注意,这个url签名的方法是和前面<15.app后端怎么设计用户登录方案>紧密联系在一起的,没看过前面一篇文章请先看。





  (1) 服务器中验证用户名和密码都正确后,把token字符串和用户id都返回给客户端,例如token字符串"daf32da456hfdh"和用户id"5"。





  (2)假设api请求为"test.com/user/info", 通过token字符串"daf32da456hfdh"生成md5签名后: md5("test.com/user/info&token=daf32da456hfdh”)= C99DC0C22437AC275C08CE4A9708B25A





  于是,api请求加上签名和用户标识后就是 "test.com/user/info?userId=5&sign= C99DC0C22437AC275C08CE4A9708B25A"





  (3)服务器接收到这个url后,用(2)的算法生成签名和sign参数对比,如果发现相等的话,就表示这个url是有有效,那就继续执行这个api调用。





  用上面的这个方法,就能避免token在api调用时泄露。





  上面的方法还有一个问题,因为这个api请求"test.com/user/info?userId=5&sign= C99DC0C22437AC275C08CE4A9708B25A"上没有过期时间,假设别人拿到这个api的请求,就能反复调用了。





  改进方法是在传递的参数中增加时间戳,当发现这个时间戳离现在的时间已经很久了,就判断这个url已经失效了。





  但用时间戳怎么保证app的时间和服务器的时间同步?在app每次启动时和服务器同步时间,然后在app内建一个时钟,时间戳在这个app的内部时钟获取,防止用户修改了手机的时间导致时间不一致。





  于是有了下面的改进方法:





  (1)假设api请求为"test.com/user/info", 用token字符串"daf32da456hfdh"和时间戳生成md5签名后: md5("test.com/user/info?userId=5&token=daf32da456hfdh&timestamp=1425860757”)= C116161A6F430343B6CECF08562F1371





  于是,api请求加上签名和用户标识后就是 "test.com/user/info?userId=5&timestamp=1425860757&sign= C116161A6F430343B6CECF08562F1371"





  (2)服务器接收到这个api请求,如果发现收到这个url请求的时间和time=1425860757相隔很久,就判断出这个url是被别人截取来反复调用了。如果时间合法,那就用(1)的算法再判断sign是否一致

2. url签名的不足之处

  url签名有两个缺点:





  1.当用户第一次登录后token是明文返回,有被截取的风险





  2. url签名只能保护token值却没法保护其他敏感数据,例如,当用户更新自己的个人信息时,所有的信息在传输过程中应该是被加密的

  怎么解决这两个问题?使用下篇介绍的对称加密的算法就可以了。

---------------------------------------------------------------------------------------------------------------------------

打开链接  app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。

【作者】曾健生

【QQ】190678908

【app后端qq群】254659220 

【微信公众号】 appbackend

【新浪微博】 @newjueqi

【博客】http://blog.csdn.net/newjueqi

版权声明:本文为博主原创文章,未经博主允许不得转载。

16.app后端如何保证通讯安全--url签名的更多相关文章

  1. 17.app后端如何保证通讯安全--aes对称加密

    在上文<16.app后端如何保证通讯安全--url签名>提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点.在本文中,会介绍对称加密的具体原理,和详 ...

  2. app后端设计(4)-- 通讯的安全性

    在app的后台设计中,一个很重要的因素是考虑通讯的安全性. 因此,我们需要考虑的要点有: 1. 在app和后台,都不能保存任何用户密码的明文 2. 在app和后台通讯的过程中,怎么保证用户信息的安全性 ...

  3. app后端设计--总目录 (转)

    特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...

  4. app后端设计--总目录

    做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里).其中的乐与苦 ...

  5. [置顶] app后端设计--总目录

    版权声明:本文为博主原创文章,未经博主允许不得转载. 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,Android客户端,iphone客户端,现就职于app云后 ...

  6. 1.用互联网的产品思维打造一本app后端的书

    刚刚接触app后端,是做完adidas中国的官方商城的时候,那时不清楚app后端应该怎么架构,只能摸着石头过河,网络上只有一些零散的资料,遇到问题,只能不断地搜索,思考,务必找到解决问题的方法. 在从 ...

  7. app后端设计(0)--总文件夹

    原文:http://blog.csdn.net/newjueqi/article/details/19003775 做了接近两年app相关的系统架构,api设计,先后在两个创业公司中工作,经历过手机网 ...

  8. app后端设计(0)--总目录(转)

    原文:http://blog.csdn.net/newjueqi/article/details/19003775 做了接近两年app相关的系统架构,api设计,先后在两个创业公司中工作,经历过手机网 ...

  9. app后端设计(php)

    来源:http://blog.csdn.net/column/details/mobilebackend.html?page=1 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经 ...

随机推荐

  1. 导入android SlidingMenu 应用

    SlidingMenu is a helpful Android library for developers. It creates a side navigation like the Faceb ...

  2. linux设备驱动程序--类class的实现

    #include <linux/module.h> #include <linux/fs.h> #include <linux/sched.h> #include ...

  3. 实现去哪儿来回机票选择的view

    最近有个控件是实现和去哪儿和阿里旅行的app的选择日历效果,反编译没有效果的情况下我自己实现了个,大致的原理是: 上面是产品需要实现的效果,我看了下不就是一个ListView+gridView就能实现 ...

  4. shell中关于sort的-o选项

    sort -o选项意思为将排序后的结果写入文件,但你可能会说我可以重定向啊: sort >file 但如果你要排序文件names里的行再写回排序后的结果: sort names > nam ...

  5. https认证

    HTTPS认证 说明 1. HTTPS协议的站点信息更加安全,同时可降低网站被劫持的风险,如网站同时存在HTTP和HTTPS站点,可使用本工具进行认证,便于百度搜索识别网站HTTP与HTTPS之间的对 ...

  6. 细说Web页面与本地电脑通讯

    话说在很久很久以前.Web页面与客户的本地电脑Localhost通讯,有两种方式: 1.Flash 2.ActiveX控件 由于Flash本人不是很了解,也给出不了什么示例代码, 对于ActiveX控 ...

  7. jvm性能优化及内存分区

     jvm性能优化及内存分区 2012-09-17 15:51:37 分类: Java Some of the default values for Sun JVMs are listed below. ...

  8. InnoDB存储引擎的总览

    InnoDB存储引擎由Innobase Oy公司开发,后被Oracle收购.从MySQL5.5版本开始是默认的存储引擎. InnoDB支持ACID事务.提供行锁设计,支持MVCC.外键,一致性非锁定读 ...

  9. Python Django开发中XSS内容过滤问题的解决

    from:http://stackoverflow.com/questions/699468/python-html-sanitizer-scrubber-filter 通过下面这个代码就可以把内容过 ...

  10. FPGA图像处理之行缓存(linebuffer)的设计一

    FPGA图像处理之行缓存(linebuffer)的设计一 作者:OpenS_Lee 1 背景知识 在FPGA数字图像处理中,行缓存的使用非常频繁,例如我们需要图像矩阵操作的时候就需要进行缓存,例如图像 ...