zoukankan      html  css  js  c++  java
  • 分析单点登录(流程图与数据安全)

         原文:[原创]单点登陆(SSO)组件的设计与实现一 
        最新修改:SSO子站点间状态管理问题.08-6-12 
        最新修改:完善SSO安全问题.08-6-11 
        
         去年公司也曾经做过一个单点登录模块,两个站点,同事是基于cookie和session来实现的,在那个模块中并没有单独的用户认证中心,每个子站都有自己的登录系统,在判断用户是否登录时,首先是通过判断cookie是否存在来判断用户登录与否.如果cookie值存在则写入session,保存登录票据.

         一般基于cookie的程序,在某种程度上来说最大的问题就是安全,因为它是以文件形式存储在客户端的.所以一般非常重要的信息,例如用户登录信息,用户银行卡信息都不会采用cookie来存储.尽管cookie可以加密,但个人总觉的不放心.为此本人一直在寻找一种安全级别高点的单点登录方案.

         前不久,本人看到了这篇文章::[原创]单点登陆(SSO)组件的设计与实现一 ,发现它是基于session的,当时特别奇怪,因为平时我们知道session是不能跨应用程序的,后来仔细分析下才知道原理:

         按照程序的思想,我改下了实现的流程图,个人好理解些:

        
          
           如果原博主看到了这张图,还望评价下是否符合原文思想呢?本人对这方面的经验还不是特别多,只能理解到此啦,望大家指教.

           本人除了更改单点登录的流程图外还想探讨下基于cookie以及基于session两种方式实现的区别及好处:

           在上面的解决方案中,联盟站点想要实现单点登录,就一定要与认证中心交互,这样就要在WEB中传递用户登录信息,一般都包括用户名和用户登录密码.这是我们最关心的问题,因为密码这种非常重要的信息在WEB中传递也是相当
    危险的,主要是有非法用户去截获传递信息来篡改用户信息。
         
          上面的解决方案原博主实现的非常好,这里我就引用下原文吧:
         

    11 本系统的安全性

    11.1 登录请求的格式

    联盟站点向认证中心发送的登录请求格式如下:

    站点信息+登录请求编号+时间戳+空用户信息+对站点信息和登录清秋号的签名信息。
    除了签名信息之外的全部信息均为明文传送,但因为重要的数据均经过数字签名,结果是站点信息和登录请求编号是不能被篡改的,保证了认证中心收到的登录请求的真实性。

    11.2 登录答复的格式

    认证中心发给联盟站点的登录答复格式如下

    登录用户信息+登录请求编号+时间戳+对用户信息和登录请求号和时间戳的签名信息
    其中登录用户信息是经过非对称加密的。请求号和时间戳因为经过签名,故也不能篡改,这样就可以保证联盟站点收到的登录答复的真实性和完整性。并且非正常联盟站点无法解密用户信息,也无法从中获取好处。  

         这里的数字签名是采用了RSA数字签名算法加密的。
       
    Code
        
           这种方式并不能防止非法用户去截获认证中心的答复信息,如果非法用法提前截获认证中心的答复信息,则他可以利用截获的答复信息用于登录,但是不能篡改信息,因为经过RSA数字签名。这个缺点也是这个方案安全上唯一的。基于cookie也同样存在这样的安全问题。基于cookie的方式将更多的处理交给客户端处理可以减轻服务器压力,这点要好于基于session方式。
     
          非常谢谢名们园友们这么费劲的看我的分析文章,大多朋友都提出安全问题,如上.@ Microshaoft,非常谢谢这位朋友的指点,他的想法和我后来的想法差不多.

          我的思路:子站用户在向认证中心发出登录请求时,附加上一个随机数或者是用户IP,附加信息都要经过加密及签名.然后认证中心返回答复信息,经过较验,如果附加信息相符则说明是合法用户.

          .@ Microshaoft的思路:

          认证中心颁发加密(对称、非对称、先用非对称加密交换对称密钥)的临时Token串,重定向的方式可以发给其他域名的站点
    其他域名的站点解密(验签)Token,自己维持状态(cookie session url等)
     
         如果把这两种方法结合起来(附加信息返回时经过特殊加密,再返回解密密钥) ,客户端根据临时Token串解密附加信息,然后再验证附加信息,这样做应该就不会有安全问题了.
         

          在学习基于session的SSO时,不明白的地方就是如何处理用户退出。
          例:如果在A站登录,同时在B,C 等站都成功登录了。此时各站都写入SESSION,一般session是有失效时间的,当A站的SESSION失效时,对其它站的登录状态是否有影响呢?当用户不调用退出而是直接关闭网页时,如何处理用户的登录状态?目前本人并没有寻找到合适的解决方案,期待中。。。

         由于上面的问题说的不太清楚,针对性不强,为此换成如下的说法:希望不会再引起看不懂的问题.

         如果在A站登录,同时在B,C 等站都成功登录了。此时各站都写入SESSION,一般session是有失效时间的,当A站的SESSION失效时,此时B和C站的SESSION没有过期,按道理说此时A站是退出状态,但此时访问B站,由于B站的SESSION没有过期,B站的用户应该是登录状态,这样是不是不统一啊.应该是要么都是登录状态要么都是退出状态吧. 
          

          本人正在寻求优越的SSO解决方案,如果园友们有什么好的方案不妨共享学习下。:)
  • 相关阅读:
    服务器实现跨域
    quartz定时任务cron表达式详解
    mysql分区/分片
    微信小程序 之三元运算符代替wx:if 来解决背景图片显示隐藏
    微信小程序 本地缓存保持登录状态之wx.setStorageSync()使用技巧
    微信小程序 赋值问题
    微信小程序 wx.navigateTo()传参及多个参数方法
    js 循环遍历数组
    VUE之Router命令行警告:Named Route 'Home' has a default child route. 解决办法
    VUE之命令行报错:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead 解决办法
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/1217084.html
Copyright © 2011-2022 走看看