pkce 是否能够防止移动应用程序秘密哈希和访问代码的泄露?

Is pkce able to protect agaisnt the compromise of mobile app secret hash and access code?

我了解涉及移动应用程序、应用程序服务器、授权服务器、资源服务器的Oauth代码流程。应用服务器使用 clientid 和 secret 向 auth 服务器注册。这个想法是移动应用程序调用应用程序服务器的端点,触发代码流最终导致从授权服务器回调到带有授权代码的应用程序服务器。应用服务器将密钥和代码提交给授权服务器以获取访问令牌。

另一个没有 clientid 和 secret 的传统选项是隐式流程,其中移动应用程序接收带有授权码的重定向 url(假设重定向 url 目的地是 SPA)将调用身份验证服务器端点以获取访问令牌。

这是不安全的,因为任何人都可以从 url 窃取访问代码。

针对移动应用程序等客户端的解决方案是使用 pkce。在初始请求中发送随机数哈希,稍后在传递授权码以检索访问令牌时对其进行验证。

如果攻击者正在窥探,这可以防止来自 url 的访问代码的泄露,因为没有初始哈希,授权代码是无用的。

但是手机phone被黑客入侵,密码和授权码被攻击者记录下来,如何处理才能防止被滥用?

这些是标准选项:

  • PKCE 对每次登录尝试使用不同的 code_verifier 和 code_challenge。如果攻击者以某种方式从系统浏览器中捕获了授权代码,则无法将其交换为令牌。没有使用客户端密码,因为移动应用程序是 public 客户端。

  • 使用 HTTPS 重定向 URI(基于移动深度链接),这样如果攻击者窃取了您的 client_id 和 redirect_uri,他们将无法收到包含授权码的响应并将无法获得代币。

有关更多详细信息,请参阅 ,但声称的 HTTPS 方案实施起来很棘手。

当然,如果攻击者完全控制了设备,包括自动填充密码等身份验证因素,仍然可能存在攻击向量

However how can the situation where the mobile phone is hacked and the secret and auth code is recorded by an attacker be handled to prevent misuse?

这超出了 OAuth 2.0 及相关规范的范围。此问题类似于在服务器中存储加密详细信息,但仍然可以通过获取物理访问权限来攻击服务器。这是完全不同的攻击向量。用户有责任确保他们的设备免受其他漏洞的侵害。

但是,PKCE 为 public 客户端对 OAuth 流程的使用提供了额外的安全层。它通过在授权服务器上建立二次验证来防止基于重定向(授权代码窃取)的攻击。

一般来说,通读 OAuth 2.0 Threat Model and Security Considerations & OAuth 2.0 for Native Apps 以获得最佳实践建议。