我在基于 token 的身份验证系统方面的经验一直涉及到 token 交换系统。我们要在其中对用户进行身份验证的应用程序会收到 token (通过请求),然后将此 token 安全地传输到身份验证系统的 token 交换服务,该服务会验证 token 并将用户信息返回给应用程序。
我最近遇到了 ZenDesk 的 SSO 实现,它使用 JWT 但没有 token 交换/验证步骤。
示例 PHP 实现在这里:https://github.com/zendesk/zendesk_jwt_sso_examples/blob/master/php_jwt.php
基本上,编码的用户信息通过 URL 和 HMAC 传递以签署请求。 ZenDesk 端将解码,验证 HMAC 是否有效(使用共享 key ),并立即根据请求的用户信息对用户进行身份验证。生成 token 的系统没有回调以确保其有效。
我的问题是:如果有人要捕获请求,并且他们对其进行解码以获取用户信息和 HMAC,难道他们不能将其发送到服务器群以开始迭代 key 直到他们弄清楚它是什么(即:使 HMAC 匹配)?然后,一旦您获得了 key ,您就可以以 CEO 的身份向 ZenDesk 进行身份验证并提出荒谬的请求?
希望我遗漏了什么,因为这种 SSO 方法是我见过的最简单的方法。
最佳答案
你完全正确。您缺少的是 - 假设用于 HMAC 的 key 哈希是安全的并且 key 是强随机的并且足够长 - 暴力破解 key 是不可行的。
关于single-sign-on - SSO 的 JWT(由 ZenDesk 使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29308107/