请参阅JWT 推荐算法的更长答案,单行答案是使用 RS256(带有 SHA 256 的 RSA 2048 位)。
JWT 令牌支持几种签名方案,主要是:RSA(RS256)、ECDSA(ES256)和 HMAC(HS256)。
HMAC 是一种专门针对 JWT 的对称签名模式。据我所知,它没有实际用例,你最好完全忽略它。
在 HMAC 中,应用程序和身份提供者共享一个秘密密码。密码用于创建和验证令牌。
想想就觉得奇怪,因为它允许客户端和身份服务器都创建身份验证令牌。“正常”操作模式仅用于身份服务器(Google、Facebook auth、内部 Active Directory 等)来验证用户并创建 JWT 令牌。客户制造代币毫无意义。
理论上,HMAC 可以用在一些奇异的 app2app 用例中,但在使用普通签名 (RSA/ECDSA) 时,这些用例已经被覆盖——而且更安全——因此 HS256 没有实际应用。
- 传递信任:Google 和 Apple 身份验证可以相互信任,共享一个秘密密码来制作内部令牌并相互交流。
除了开箱即用的常规签名已经支持联合身份验证,而且更容易。没有理由更喜欢秘密密码,在组织之间共享秘密密码需要额外的工作,如果任何一个泄露秘密,两个组织都会受到损害。
- app2app 身份验证:服务可以向身份服务器进行身份验证,以获取自己的 JWT 令牌并与其他服务(受身份验证保护)进行通信。
除了已使用用户名/密码或证书身份验证开箱即用地支持编程身份验证。没有理由更喜欢秘密密码。
我以身份验证为生,我已经在一些公司实现了所有这些用例。在规范的深渊中,在client_credentials
授予服务到服务身份验证(除了客户端证书身份验证之外)中,还有一些关于客户端签署 JWT 令牌的事情。我 99% 确定这是唯一可以使用共享密钥模式的地方(以一种非疯狂的方式),以及为什么规范中完全支持该模式......并且使用证书身份验证可以更好地涵盖所有这些。