令牌内容的构成
令牌内容的第一、二、三、五部分内容长度是固定的,第四部分内容可根据应用的实际需要进行扩充,除了存储用户信息之外,还可以存储其他与应用相关的信息,具有较强的可扩充性,避免了因固定长度带来令牌可扩充性的限制。
令牌内容的加密和解密
为了保证令牌在传递过程中的安全,必须对原始令牌的内容进行加密,本文对令牌中的校验信息使用不可逆加密算法,防止校验令牌在传输过程中被截 取并篡改;用户信息使用对称加密算法,以便其他系统的解密。目前采用了AES、SHA-1、Base64等三种加/解密算法,通过这三种加/解密算法保证 数据的安全。
AES加密算法用于加密用户信息及生成的令牌;SHA-1算法用于计算用户密码和令牌的校验和;Base64将AES加密后的令牌编/解码。
加密流程
令牌加密流程首先按令牌内容结构填充内容,计算内容的校验和后填充到校验和内容区。加密流程图如图2。
1. 将版本号、当前用户登录时间、会话失效时间和用户登录信息按照令牌各部分所属位置进行填充。
2. 系统A中的用户密码在注册时已经将用 户登录密码使用MD5加密,就不再使用AES加密算法对用户登录密码加密,直接使用SHA-1计算出用户登录密码的校验和(记为D1),填充到令牌数组的 最后20位里。
3. 由于直接将密码的校验和发送给客户端将带来安全性的问题,本应用中将使用SHA-1再次计算整个令牌数组的校验和(记为D2),得到 一个新的20位数组,并填充到原令牌数组里的最后20位里,用校验和D2验证令牌在传递过程中是否被篡改,如同电子指纹的作用。
4. 使用AES加密算法 对令牌数组进行加密,再使用Base64算法进行编码得到令牌,在系统之间传输的即是此令牌。
解密流程
令牌解密流程较加密流程复杂一些,过程与令牌加密流程相反,增加了令牌内容校验和与接收的校验和比较,以比较结果作为令牌是否被篡改的依据。解密流程图如图3。
1. 使用Base64算法解码,再使用AES解密算法对解码后的数组进行解密。
2. 取出解密令牌数组的最后20位(记为D1)。同时获取 系统B中存储的经MD5加密的用户密码,使用SHA-1计算校验和,填充到解密令牌数组的最后20位里,再次使用SHA-1计算整个令牌数组的校验和(记 为D2)。
3. 比较D1和D2是否一致,如果不一致则说明令牌在传递过程中被篡改,跳转到系统B的登录页面重新登录;如果一致则完成后续的登录校验,跳 转到系统B的应用界面。
令牌的集成应用
用户首先从系统A登录,后台验证无误后按照加密流程生成当前用户的SSO令牌。用户从系统A切换到系统B时,提交到系统B的登录模块中的信息中包含由系统A生成的SSO令牌,系统B按照解密流程对SSO令牌解密,验证无误后由系统B完成登录并跳转到系统B的应用界面。