最近这段时间,一直都在和web服务打交道。自己项目组的系统需要别的项目组提供服务接口;别的平台(手机)平台又需要我们这边给它们提供接口。实现、调用、接口文档都有所涉及。从中我发现一个非常重要的问题——安全,这是一个被严重忽略的问题。

我认为在网络这个充满敌意的大环境下,应用和服务的安全性,是一个不得不重视的问题。去年年底的CSDN账号泄露以及口令明文的事件,至少给了企业两个最基本的警示:(1)不要等到出现问题之后,才知道要去挽救,在这个浮躁的社会氛围下,出现哪怕不是什么大问题,都会被群起而攻之;(2)服务的提供方应该认识到安全的重要性。本文参考OAuth协议的工作原理,给出了我个人觉得更为安全的服务认证和授权方式。一家之谈,欢迎各位提出宝贵意见。

几个项目组对于web服务的处理方式:

(1)   仅仅是一个简单的明文key,用来标识属于哪个平台;

(2)   服务提供方和调用方协商一种验证码的生成规则,服务的调用方携带用户id以及生成的验证码。在服务提供方一端有个验证的方式,如果按照同样的规则生成出相同的验证码,则认为调用方是合法调用者

简单的谈谈这两种方式吧,其实第一种没什么好谈的。它只是用了一个标识符,标识服务的调用方来自哪个平台,然后在它方法中表明应该走入哪个分支,这显而易见。还有一个我觉得没什么好谈的就是,它简直就是个“肉鸡”,甚至连“肉鸡”都算不上。只要你知道URL,想干嘛干嘛去吧;第二种方式,不得不说至少比第一种方式高级得多。它至少仿照了类似数字签名的做法。但不得不说,还是有些简单并直接了。并且,要知道只要基于了同一种生成验证码的规则(注意这里并不是hash散列算法),那么它的灵活性和随机性就会降低。有一种比较简单而有效的攻击手段——DOS(拒绝服务),上面两种方式都无法逃过这样的攻击。原因是:

(1)   URL是定死的,或者很长一段时间才会改变为另一种形式的,但在服务端并没有关于对来自同一个IP,在一段时间内访问次数的限制

(2)   没有对调用方进行认证

对于采用HTTP GET形式的Web Service调用都会有这些安全问题。后台引用的调用方式也难以幸免于难,因为它们本质上都是一样的。其实,一方需要另一方提供服务,这种场景在互联网中早已司空见惯。新浪、腾讯、人人、网易等开放平台都是服务的提供者,它们是如何来保证服务的安全性以达到保证平台用户资源的安全?没错,它们几乎都是使用——OAuth这种认证和授权协议。

OAuth协议简介

具体的文字解释,参见wiki——OAuth

应用场景:

请求过程示意图:

项目目前对于web服务【web service/web page】的调用场景:

OAuth照搬?

OAuth的认证和授权过程中,通常都有一步需要用户授权的过程,也就是需要将用户引导到第三方服务提供者的授权页面(通常需要填写用户名和密码),并引导用户完成授权。在系统中,并不适合引入这样的交互模式。因为我们现在的系统从第三方提取数据对用户来讲是透明的,用户登录我们的系统,并不知道,我们的数据是来自第三方提供的。所以这极其影响用户体验。并且,参照资源的重要级别,并不是所有服务都需要享受这么机密的待遇(从Oath授权可以看到,需要多次的“握手”,也就是需要来回HTTP请求好几次),有时资源重要性是需要考虑的一个方面,而有时保证服务正常提供、提供服务的服务器正常运转则更为侧重。

如何兼顾安全、性能?

下图展示了本人对于兼顾安全以及性能的设想:

对于步骤说明:

第一次交互称之为:握手(也就是认证和授权的过程),由于这些服务本质上只对已知系统的特定用户开放,而非互联网应用的开放级别。所以这里省去了第一步验证客户端身份,获取Request Token的过程(或者称之为合二为一)。

步骤1:请求方采用HTTPS协议,封送能够认证调用方合法身份。这里封送什么内容呢?可以是服务提供方分配的用户名或密码对,可以是类似于上面的验证码,还可以是提供方公开的密钥。以上这些针对公共资源服务就足够了,对于类似微博那些设计到私有用户的资源,需要能够提供服务方用户检索特定资源的标识(很明显这些标识在服务调用方必须已知,比如userId等XXXID,如果不得不需要,可以在用户注册服务调用方系统的时候自行填写)。

这里你可能有一个疑问,公共资源就算了,受限资源为什么不需要用户在服务提供方平台的密码?这里还是涉及到信任级别的问题,我认为这确实是一个需要权衡的问题。或者说需要视特定应用场景以及资源的保护级别而定。上面提供的那些认证信息(包括XXXID,服务提供方会在特定的数据表中检索,以再次验证请求的合法性),足以表明服务的调用方确实是可信的,对于保护级别不是特别高(特别是应对公司内部,系统与系统之间的交互场景),最重要的是检索数据的服务而言,就可以允许调用方获取它想提取的信息了。当然如果,确实需要得到资源拥有者的授权,那么把用户定向到服务提供者的授权页面,也未尝不可。

步骤2:返回服务调用方Access Token.这是关键的一步。与开始我们谈到的我们既有的两种“验证方式”根本的不同点在于——服务提供者能够控制局面。这里可以实现各种不同的安全机制,限制访问时间,限制访问次数,限制IP在某一时间段内的访问次数等等。你可以在服务提供程序中,对于前来握手的服务调用方的信息进行维护,如:

Application[“172.40.38.1”]=”asdfj2093423uwqesdjfdfepclkjd”;
采用访问者的ip作为key ,服务端生成的一串accsee token作为value,在服务提供端进行维护。当然,你可以定义一个结构:

class visitorInfo{ private int totalCount; //允许的总访问次数 private int currentCount; //当前已经访问次数 private DateTime startTime; //会话的开始时间 private DateTime endTime; //会话的结束时间 Private string accessToken; //访问令牌 Private string reflushToken; //刷新token(可选的) }

以进行更合理的控制并作日志记录,至于怎么维护这个结构,在内存中还是持久化到数据库,这个不是这篇的话题。

步骤2的输出就是访问令牌当然你也可以加上一个刷新令牌(这个是可选的,主要是为了在一次会话过期后,调用方可以拿着刷新令牌,直接换取一个新的访问令牌,而不需要重新认证,当然你也可以选择让调用方重新认证。

第二次交互:服务的请求和应答,这里就没有什么特别的了。

步骤3:调用方拿着服务提供方授予的access token或者用户检索受限资源的XXXID,就可以请求服务了(只是普通的http请求)。这里,局面就可以完全被服务调用方hold住,它可以对IP和Access Token进行验证,要是有必要,也可以对会话是否过期,或者一段时间内的访问次数进行验证,而无需担心恶意中间人的重放或DOS攻击。因为服务方维护了认证过的调用方的access token以及IP。

步骤4:应答请求。

总结

这里参考了OAuth协议的工作原理,并加以精简以适应某些系统对系统提供服务的场景。再次声明,这里只是在安全和性能之间找了一个平衡点,使得你的服务应用更为坚固。如果你想要更为安全的做法,可以完全参照OAuth的设计,强制要求用户进行授权(上面已经解释了应该如何处理)。

无论如何,对于这种共享数据之类的服务,协商和人为交互的频度还是比较大的,并且效率不是太高。有没有从根本上解决这种问题的办法?有,那就是不提供这些服务。那应该怎么办?下一篇推崇——浅谈企业业务数据的整合。敬请期待!

转载于:https://www.cnblogs.com/wdpp/archive/2012/03/04/2386577.html

[置顶] OAuth工作原理随想——让你的系统提供的服务更加安全相关推荐

  1. 帖子置顶原理 php,自定义织梦cms文章置顶及其功能原理分析

    本人在织梦dedecms本发分类信息发布系统那个功能的时候,因为,用到置顶功能,这是很多分类信息系统最很重要的特色,所以,对这个作了一个织梦dedecms系统的研究,以前用织梦dedecms系统建站, ...

  2. 计算机时钟的工作原理,单片机的周期与系统时钟的工作原理

    我们先来理解几个比较重要的概念:时间周期.指令周期.机器周期,以及系统时钟的工作原理. 时钟周期: 时钟周期也叫振荡周期或晶振周期,即晶振的单位时间发出的脉冲数,一般有外部的振晶产生,比如12MHZ= ...

  3. 数字调制系统工作原理_浙江红警系统马路警示灯工作原理近期行情

    ​警示灯,警示灯选型​警示灯厂家,警示灯价格​警示灯厂家,多层警示灯红警系统马路警示灯工作原理​警示灯厂,警示灯工厂红警系统马路警示灯工作原理​警示灯,警示灯选型 警示灯,警示灯选型 警示灯,警示灯选 ...

  4. [置顶] 总结工作中常用到的linux命令

    常用解压命令 tar.bz2 命令: tar -jxvf  *.tar.bz2 tar.z   命令: tar -zxvf  *.tar.z tar.gz   命令: tar -Zxvf  *.tar ...

  5. Java 内存管理、JVM 工作原理与 Java 运行时系统

    Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...

  6. 区块链工作原理(区块链治理系统、比特币、以太坊、智能合约)

    文章目录 Blockchain Governance System On-Chain Governance Off-Chain Governance BitCoin Blockchain Ethere ...

  7. Linux下轻松理解防火墙的工作原理及相关设置(三)firewalld服务、包括Direct Rules 和Rich Rules (地址伪装和转发)

    文章目录 firewalld概述 firewall和iptables的不同 firewalld常用命令 firewalld基本管理 1.图形化操作 firewall-config 2.命令化操作 火墙 ...

  8. 从渲染页面的角度来聊一聊浏览器的工作原理

    从渲染页面的角度来聊一聊浏览器的工作原理 页面内容快速加载和流畅的交互是用户希望得到的Web体验,因此,开发者应力争实现这两个目标. 了解如何提升性能和感知性能,有助于了解浏览器的工作原理. 概述 快 ...

  9. iptables防火墙工作原理及简单配置访问策略

    iptables只是管理包过滤规则的工具,可以添加或删除包过滤的规则,真正执行包过滤规则的是netfilter netfilter是Linux核心中的一个通用架构,内部提供一些列的表,每个表由若干条链 ...

最新文章

  1. java远程方法调用(rmi)--好_RMI-Java远程方法调用的实现(二)
  2. 你陪我长大 我陪你变老
  3. javascript的基础知识
  4. Additive属性动画
  5. java throw异常_java throw拋出异常详解
  6. 源码分析Thread
  7. 【重点】Batch Normalization的诅咒
  8. c# json转换实例
  9. 高通 MSM8K bootloader 之四: ramdump
  10. zipf定律与相似性度量
  11. Oracle导出dmp文件(数据库备份、数据库导出、数据库转移)
  12. 走迷宫小游戏课设(C语言)
  13. 1. Linux系统简介
  14. LRU算法模拟器(基于Java和VUE前端实现)
  15. 如何建设企业入侵防御体系
  16. [生存志] 第109节 秦始皇初玩叠人塔
  17. Go语言Windows系统开发环境配置
  18. PandoraBox运行Xware(迅雷远程下载)的试验
  19. matlab 求加速度,【求助】位移转加速度(谱转换法)
  20. 设计模式中的“万一”和“有限责任”

热门文章

  1. JavaScript open() 函数
  2. 开发工具 | git、github使用场景总结
  3. VirtualBox中安装CentOS(新手教程)
  4. Unix时间戳转换(python)
  5. JavaScript 自定义对象
  6. XenDesktop7-基于SCVMM2012SP1的部署
  7. Exchange2010之资源邮箱
  8. 使用AMDU工具从无法MOUNT的DISKGROUP中抽取数据文件
  9. 随手小记 才知道系列
  10. RMQ(Range Minimum/Maximum Query)问题: