一、单点登录介绍
单点登录(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,用来校验令牌是否被修改,计算校验和
令牌内容的第一、二、三、四部分内容长度是固定的,第五部分内容可根据应用的实际需要进行扩充,除了存储用户信息之外,还可以存储其他与应用相关的信息,具有较强的可扩充性,避免了因固定长度带来令牌可扩充性的限制。
创建令牌代码如下:
校验令牌:
四、令牌加密和解密
为了保证令牌在传递过程中的安全,必须对原始令牌的内容进行加密,本文对令牌中的校验信息使用不可逆加密算法,防止校验令牌在传输过程中被截 取并篡改;用户信息使用对称加密算法,以便其他系统的解密。目前采用了AES、SHA-1、Base64等三种加/解密算法,通过这三种加/解密算法保证 数据的安全。
AES加密算法用于加密用户信息及生成的令牌;SHA-1算法用于计算用户密码和令牌的校验和;Base64将AES加密后的令牌编/解码。
以AES加解密举例:
本例只是单点登录的一种方案,关于令牌结构和安全性方面,可以根据各自在项目中的需要进行定制化开发,例如:可以先对令牌进行AES对称加密,再使用RSA进行非对称加密提高令牌的安全性。等等。
转载于:https://blog.51cto.com/10085711/2069265