梁正华 弓晓锋 黄 琳 周 慧
(1.贵州省科技创新中心有限责任公司,贵州贵阳 550002;2.贵州省科技信息中心,贵州贵阳 550002)
传统软件设计一般采用单体结构,随着业务场景越来越复杂,应用范围越来越广,分布式软件架构的应用场景越来越多。近几年,微服务架构映入开发者的眼帘,微服务架构将软件系统设计为若干个独立的、通过网络通信的服务[1]。传统软件设计一般使用在服务端,以保存Session 会话的方式实现用户的认证授权,但微服务架构中的微服务数量众多,且常常部署在不同的服务器上,服务之间难以实现Session 的共享。因此,传统基于Session 的认证授权方式无法用于微服务架构体系,基于令牌Token 的认证授权方式成为一种合理的微服务认证授权体系解决方案,它能够提供一种合理的方法对微服务的访问权限进行管理。令牌Token 包含用户的身份信息和授权信息,并且可以通过加密和签名确保其完整性和真实性。同时,令牌的发放和验证过程也可以使用各种安全机制,如随机数、时间戳等,以防止令牌被篡改或重放。同时,令牌的发放和验证过程都有记录,从而可以提供完整的审计跟踪,便于追踪和管理用户访问权限。基于令牌的认证授权方式还具有良好的扩展性,当需要添加新的微服务或者扩展现有系统时,只需要对令牌进行相应处理即可,无需对每个服务都进行单独的认证和授权。
OAuth2.0 协议又称为开放授权2.0 协议,是一种开放的认证授权协议,为各类程序提供了一种简单、安全的访问机制。该协议允许用户授权第三方应用访问其受保护的资源,而无需直接提供其用户名和密码。这种授权方式是通过使用访问令牌(Access Token)实现的,访问令牌是由授权服务器颁发给客户端的,代表用户对资源进行访问。OAuth2.0 协议实现了在客户端不获取用户敏感信息(如用户名、密码等)的前提下,能够在一定授权范围内获取受保护的资源[2]。OAuth2.0 协议中有4 种执行角色,OAuth2.0 协议中各执行角色进行认证授权的时序图如图1 所示。
图1 各执行角色认证授权时序图
OAuth2.0 协议用户进行认证授权的流程如下。(1)客户端向资源拥有者请求受保护资源的访问授权。(2)资源拥有者返回受保护资源的授权许可到客户端。(3)客户端将获得的授权许可发送到授权服务器。(4)授权服务器验证客户端发送的授权许可。若通过验证,则返回受保护资源的访问令牌到客户端。(5)客户端将获得的访问令牌发送到资源服务器,试图获取受保护资源。(6)资源服务器验证客户端发送的访问令牌。若通过验证,则返回受保护资源,供客户端使用。
同时,OAuth 2.0 协议定义了4 种授权模式。(1)授权码模式。该模式是要求最高、访问流程加密性最高的访问模式,客户端与授权服务器根据需要进行相应互动。当用户登录授权后,向资源拥有者获取授权码,再利用该授权码从授权服务器得到受保护资源的访问令牌,最后才能访问受保护资源。(2)密码模式。在该模式中,用户向客户端输入用户名和密码。客户端再根据这些信息向权限系统申请受限制资源的访问权限。该模式由于要求客户输入敏感信息(用户名和密码),使用时具有较大的局限性,只适用于用户对客户端高度信任的环境中。(3)隐藏模式。该模式可以省略用户向资源拥有者获取授权码的步骤,直接向授权服务器要求令牌,授权服务器直接向客户端颁发令牌。该模式安全性不如授权码模式,只能用于令牌会话期有效的场景,每次令牌的有效期不长,过期则失效。(4)客户端凭证模式。该模式不对用户进行任何验证,只对客户端进行验证,并向客户端颁发凭证,也就是客户端令牌。若不同的用户在同一客户端登录,则将共享同一个客户端令牌。
2010 年,SM3 国产密码算法由中国国家密码管理局发布,是我国具有自主知识产权的密码杂凑算法[3]。SM3国产密码算法将输入的消息经过消息填充、消息分组和迭代压缩等步骤,生成256bit 杂凑值,即散列值。
SM3 算法的实施流程主要包含4 个步骤。一是消息填充。将输入数据按照512 位的大小分成若干组,最后一组不足512 位时,按规则填充至512 位。填充规则包括先填充一个“1”,后面加上k个“0”,其中k是满足(n+1+k) mod512=448 的最小正整数。再追加64 位的数据长度(bit 为单位,大端序存放)。二是消息扩展。将一个512 位数据分组划分为16 个消息字,作为生成的132个消息字的前16 个,再用这16 个消息字递推生成剩余的116 个消息字。三是迭代压缩。经过多轮迭代压缩后,输出长度为256 位的摘要值。四是输出结果。将摘要值输出,作为SM3 算法的结果。
SM3 算法的压缩函数与国际常用的SHA256 杂凑算法的压缩函数具有相似性,但SM3 杂凑算法的压缩函数具有自己的特点,其结构及消息扩展流程设计思路更加复杂。SM3 算法的压缩函数采用了Merkle-Damgård 结构,该结构将输入的消息分组划分为多个512 位的块,然后对每个块进行迭代压缩处理。在压缩过程中,SM3 算法使用了布尔函数、循环移位、模加运算等操作,以确保输出的哈希值具有高度的混淆和扩散特性。例如,SM3 算法的压缩函数每一轮使用2 个消息字,消息扩展使用5 个消息字。因此,SM3 国产密码算法相对于MD5、SHA0、SHA1、SHA256 等常见杂凑算法,在安全性方面优势突出。
基于OAuth 2.0 的微服务认证授权体系是一种安全机制,可以在多个微服务之间实现授权和访问控制。该体系利用OAuth 2.0 协议实现对资源的保护和授权,同时支持跨平台、跨语言应用程序之间的集成和互操作。这种机制下,通过访问令牌实现对资源的访问控制,令牌的发放和使用都经过严格的授权和验证,有效防止了未经授权的访问和数据泄露。同时,这种方式也支持自定义扩展和插件化开发,可以根据实际需求进行个性化定制。
在基于OAuth2.0 的微服务认证授权体系中[4],存在令牌可能被窃取或恶意篡改等风险,具有较大的安全隐患。为解决类似安全问题,可尝试将SM3 杂凑算法运用于该认证授权体系中,具体流程如下。
(1)OAuth2.0 的微服务认证授权中的授权服务器与资源服务器,协商密钥SecretKey,该密钥将用于SM3国产密码杂凑算法,生成杂凑值,该密钥只有授权服务器与认证服务器知晓。
(2)授权服务器给客户端发送授权令牌前,先调用SM3 国产密码,杂凑算法为该令牌生成杂凑值。例如,AuthCode1=SM3(Token,SecretKey),将该客户端ID 及对应的令牌杂凑值AuthCode1 发送给资源服务器,资源服务器对该信息进行记录。
(3)当客户端向资源服务器发送访问令牌,试图访问受保护资源时,资源服务器使用之前与授权服务器协商好的密钥SecretKey,调用SM3 国产密码杂凑算法对客户端发过来的令牌进行杂凑值生成。例如,AuthCode2=SM3(Token,SecretKey),资源服务器通过客户端ID,查询存储的杂凑值信息,找到该客户端ID 对应的记录杂凑值AuthCode1。若AuthCode1 与AuthCode2 相同,则令牌未被篡改,客户端可进行后续步骤,拿到受保护资源;若AuthCode1 与AuthCode2 不相同,则令牌已被篡改,资源服务器回传错误信息,客户端获取受保护资源失败[5-7]。
用以上步骤改造后的OAuth2.0 协议中各执行角色进行认证授权的时序图如图2 所示,第5 和第7 步为改造后增加的步骤。
图2 改造后的各执行角色进行认证授权时序图
在基于OAuth2.0 的微服务认证授权体系中,使用自主可控的国产密码杂凑算法SM3 生成和验证令牌Token,解决了令牌可能被窃取或恶意篡改的问题,大幅提高了该认证授权体系的安全性。在令牌的验证过程中,使用SM3 算法可以快速地验证令牌的有效性,减少系统的响应时间,提高整个系统的性能。国产密码算法SM3 自主安全可控,完全满足国家信创要求。
同时,SM3 算法面临多方面的挑战。一是密码分析攻击。SM3 算法是一种密码哈希函数,其安全性取决于对输入数据的哈希能力和对哈希值的抗冲突能力。攻击者可能会对SM3 算法的内部机制进行攻击。二是应用于加密货币的压力。SM3 算法作为数字签名和交易验证的重要工具,面临来自黑客和恶意攻击者的威胁。攻击者可能会对SM3 算法进行破解,以窃取加密货币或破坏交易验证过程。三是技术更新和兼容性问题。SM3 算法是一种相对较新的密码算法,其开发和实现需要一定的技术水平和资源投入。同时,一些传统的密码算法和系统存在一定的兼容性问题,需要进行技术更新和升级改造。