(一)

在项目开发的过程中,经常会出现这样的情况:我们的产品包括很多,以QQ举例,如登陆、好友下载、群下载、网络硬盘、QQ游戏、QQ音乐等,总不能要求用户每次输入用户名、密码吧,为解决这个问题,高手提出了一个很好的跨平台、跨应用的身份验证解决方案,那就是——单点登录(Single Sign On),简称为 SSO。
一、 什么是单点登录(Single Sign On)
单点登录(SSO,Single Sign-on)是一种方便用户访问多个系统的技术,用户只需在登录时进行一次注册,就可以在多个系统间自由穿梭,不必重复输入用户名和密码来确定身份。
二、如何实现单点登录(SSO)
1、整体设计思路
首先我们要明确单点登录的运行模式,即统一身份验证,在解决方案中,一般通过认证服务器(LoginServer)实现用户身份验证,验证通过后将自动随机生成身份验证票据,并将身份验证票据发送给用户,待用户访问其他应用时,只对身份验证票据进行合法性验证即可。
2、认证服务器(LoginServer)实现的功能
在解决方案中,LoginServer提供的功能包括用户名/密码验证、身份验证票据的生成、身份验证票据的合法性验证这三个最基本的功能,其他功能可以根据用户的需求,自行扩展。
由于LoginServer基于网络通讯,使用TCP或UDP协议,所以其本身是跨平台的,只要各个应用在开发过程中使用的开发语言支持身份验证票据验证,即可调用身份验证平台进行相关的操作。
3、身份验证票据
所谓身份验证票据就是用户身份验证通过后,发给用户用以标示身份验证通过的信息。身份验证票据中可以加密保存用户的身份信息或某一特定的验证信息等,一般使用对称加密,方便在身份验证票据合法性的检查中进行相应的解密。C/S结构的程序,票据保存比较方便,只要其他应用能够取到就可以。
4、验证票据
用户拿到身份验证票据后,当登录B系统时,把这个票据传给B系统,B系统拿这个票据系统到LoginServer进行认证即可。

(二)

在上面文档中,初步介绍了S架构程序多种类服务器之间实现单点登录的流程,可是当用户量巨大或某项产品的重复登录频繁时,这种单点登录(SSO)实现就出现了瓶颈,如下:
多台LoginServer服务器之间共享数据比较困难,只能通过共享内存或数据库共享,很难跨机房部署。
随着业务量的增加,LoginServer服务的需求量也直线上升,而且出现问题的概率很高,经常造成正常用户的认证失败。
为解决上述问题,建议票据的认证有子系统的服务器完成,从而降低出现问题的概率,减少服务器压力。具体的方法如下:
1、加密身份验证票据
LoginServer服务器使用对称加密算法加密身份验证票据,如RC6、AES和Blowfish等,票据内容包括用户名、认证时间、IP地址、自定义数据等信息。客户端登录后,LoginServer把加密后的密串通知给客户端。
2、验证身份票据
其他系统和LoginServer服务器共享对称加密算法和密钥,拿到客户端的密串后使用相同算法和密钥解密,然后对比用户名、认证时间、IP地址、自定义数据等,如相同则允许登录。
3、安全问题
我们知道对称加密算法的破解是有可能的,在算法已知的情况下,密钥、明文、密文,三者得到两者可以计算出另外一个;在上述方法中,明文增加了自定义数据,用户名、认证时间每个用户都不同,所以黑客一般无法取得正常明文;我们只向客户端通知密文,所以客户端应不能通过密文穷举得到明文+密钥,所以无法破解。
4、源代码泄露
如果服务器源代码泄露,则可能泄露加密算法、密钥、明文等;此时的补救方法是及时更新密钥、调整自定义数据,所有产品都需要同时更新,明文和密钥都发生变化,泄露代码的风险就可以忽略了。
如果服务器架构足够智能,则可以定时更新密钥和自定义数据,如每个月更新一次,则整个实现体系就非常安全了;更新密钥时切记做好兼容工作,确保更新前用户取得的身份票据有一定的时间可以验证成功。
5、使用范围
上面这个方法用于自己公司的服务器之间没有问题,但如果是要登录其他合作伙伴的产品,则需要单独协商加密密钥和自定义数据即可。

出处:https://www.cnblogs.com/starksoft/p/4809362.html

C/S架构程序多种类服务器之间实现单点登录的更多相关文章

  1. C/S架构程序多种类服务器之间实现单点登录(转)

    (一) 在项目开发的过程中,经常会出现这样的情况:我们的产品包括很多,以QQ举例,如登陆.好友下载.群下载.网络硬盘.QQ游戏.QQ音乐等,总不能要求用户每次输入用户名.密码吧,为解决这个问题,高手提 ...

  2. CentOS 7 服务器之间ssh无密码登录、传输文件

    在Linux服务器之间使用ssh命令向另一个Linux服务器发送执行指令是需要输入密码     ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一 ...

  3. 批量实现多台服务器之间ssh无密码登录的相互信任关系

    最近IDC上架了一批hadoop大数据业务服务器,由于集群环境需要在这些服务器之间实现ssh无密码登录的相互信任关系.具体的实现思路:在其中的任一台服务器上通过"ssh-keygen -t ...

  4. SSH远程登录:两台或多台服务器之间免密登录设置

    有两台(或多台)同局域网的服务器A:192.168.2.21,B:192.168.2.25.让A,B这两台服务器之间能两两互相免密登录,并且每台服务器都可以自我免密登录(自我免密登录即:ssh loc ...

  5. Java架构师必知:什么是单点登录,主要会应用于哪些场景?

    单点登录在大型网站里使用得非常频繁,例如,阿里旗下有淘宝.天猫.支付宝,阿里巴巴,阿里妈妈,阿里妹妹等网站,还有背后的成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都 ...

  6. 【原】通过Spring-Session实现不同系统之间的单点登录

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.目前市面上有很 ...

  7. 基于EasyNVR摄像机无插件直播流媒体服务器实现类似于单点登录功能的免登录直播功能

    提出问题 EasyNVR是一套摄像机无插件直播的流媒体服务器软件,他可以接入各种各样的摄像机,再经过转化统一输出无插件化直播的RTMP.HLS.HTTP-FLV流,同时,EasyNVR为了数据安全,提 ...

  8. 【原】linux两台服务器之间免密登录方法

    搭建集群机器192.168.0.100和192.168.0.200里,需要两台机器中间相互拷贝文件: 方式一:下载192.168.0.100机器文件到本地,再将本地文件拷贝到B机器 方式二:192.1 ...

  9. Linux服务器之间免密登录设置

    说明: A为linux服务器a B为linux服务器b 每台linux都有ssh的服务端和客户端,linux下的ssh命令就是一个客户端 我们常用ssh协议来进行登陆或者是文件的拷贝,都需要密码 A要 ...

随机推荐

  1. VS2010编译Unigine_2010源码

    VS2010编译Unigine_2010源码[Debug版本] 1.Laucher工程属性改为控制台项目 2.Unigine工程编译时的Warnning LNK2019 a.属性--常规-目标文件名改 ...

  2. 7.1 C++模板基本概念及语法 《C++模板与标准模板库》

    参考:http://www.weixueyuan.net/view/6398.html 总结: 模板是另一种代码重用机制. 需要设计的几个类,其功能都是一样的,仅仅只是需要操作的数据类型不同. 有更好 ...

  3. POJ - 2635 E - The Embarrassed Cryptographer

    The young and very promising cryptographer Odd Even has implemented the security module of a large s ...

  4. EF code first Mysql 更换主键类型

    把主键从long 改为int 居然要删掉重建,不知道有没有更好的办法. 删除带外键的表: Add-Migration name 修改生成的文件,主要把dbo.删除 然后update-database

  5. day 关于生成器的函数

    def average(): count=0 toatal=0 average=0 while True: value=yield average toatal+=value count+=1 ave ...

  6. python scrapy爬虫存储数据库方法带去重步骤

    import pymongo import requests import random import time import pymysql db = pymongo.MongoClient()[' ...

  7. 2019-03-15-day011-递归生成器

    函数的进阶: 动态参数: 两种: 动态位置参数 > 动态默认参数 打散(聚合): 实参处打散 形参处聚合 不在函数中第一次使用*打散,第二次是聚合 在数据库中快速写入数据的时候,**dic 名称 ...

  8. intellij构建多模块项目

    1.新建sailfish总目录, 2.新建maven项目,并将其手动移入sailfish,再用intellij打开该项目, <groupId>com.rainbow.sailfish< ...

  9. less中使用calc

    css3中可以使用calc()来实现自适应布局 例如:width:“calc(100%  - 25px)” width: calc(expression); ==> expression是一个表 ...

  10. js- caller、 callee

    caller 返回一个对函数的引用,该函数调用了当前函数.    functionName.caller     functionName对象 是所执行函数的名称.  说明        对于函数来说 ...