您的位置 首页 java

单点登录系统原理和实现

一、 单点登录 介绍

单点登录(Single Sign On),简称为 SSO ,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。也就是说,a.test.cn和b.test.cn两个站点之间只需要登录一次即可。

二、实现原理

当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--令牌;用户再访问别的应用的时候,就会将这个令牌带上,作为自己认证的凭据,应用系统接受到请求之后会把令牌送到认证服务器进行校验,校验令牌的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问业务服务器B和业务服务器C了。如下图:

三、实现令牌( Java 语言为例)

令牌构成:

头 + 令牌长度(不包括校验和) + 登录时间 + 失效时间 + 用户信息 + 校验和

名称

开始位置

结束位置

0

3

令牌长度

4

7

登录时间

8

15

失效时间

16

24

用户信息

24

n

校验和

n+1

m

1、0~3,共4位,存储令牌的信息(包括版本号等等)预留便于以后扩展。

2、4~7,共4位,java中int占用4个字节,用4位来表示令牌长度完全足够了。

3、8~15,16~24,各占8位,java中 long 占8个字节,用long表示时间戳

4、24~n,表示用户的身份信息,可以存储用户在数据库中的 唯一识别码

5、n+1~m,用来校验令牌是否被修改,计算校验和

令牌内容的第一、二、三、四部分内容长度是固定的,第五部分内容可根据应用的实际需要进行扩充,除了存储用户信息之外,还可以存储其他与应用相关的信息,具有较强的可扩充性,避免了因固定长度带来令牌可扩充性的限制。

创建令牌代码如下:

创建令牌

int和long转成byte

byte转成对应的int或long

数组合并方法

计算校验和

校验令牌:

校验令牌1

校验令牌2

四、令牌加密和解密

为了保证令牌在传递过程中的安全,必须对原始令牌的内容进行加密,本文对令牌中的校验信息使用不可逆加密 算法 ,防止校验令牌在传输过程中被截 取并篡改;用户信息使用 对称加密算法 ,以便其他系统的解密。目前采用了AES、 SHA-1 、Base64等三种加/解密算法,通过这三种加/解密算法保证 数据的安全。

AES加密算法用于加密用户信息及生成的令牌;SHA-1算法用于计算用户密码和令牌的校验和;Base64将AES加密后的令牌编/解码。

以AES加解密举例:

AES加密

AES解密

本例只是单点登录的一种方案,关于令牌结构和安全性方面,可以根据各自在项目中的需要进行定制化开发,例如:可以先对令牌进行AES对称加密,再使用 RSA 进行非对称加密提高令牌的安全性。等等。

需要源码的小伙伴,可以私信我。

文章来源:智云一二三科技

文章标题:单点登录系统原理和实现

文章地址:https://www.zhihuclub.com/201138.shtml

关于作者: 智云科技

热门文章

网站地图