了解 PKCE 与授权代码授予的优势

Jai*_*ime 9 security oauth token oauth-2.0 pkce

我是 OAuth 世界的新手,我试图了解使用 PKCE 相对于传统授权代码授予的好处。(我的许多假设可能是错误的,所以感谢您的指正。)

我是一名移动应用程序开发人员,根据 OAuth 文档,客户端机密不能在公共客户端的应用程序代码中进行硬编码。避免对客户端密钥进行硬编码的原因是,黑客可以反编译我的应用程序并获取我的客户端密钥。

黑客利用我的客户端密码和我的redirect_url,可以开发一个虚假的应用程序。如果最终用户 (User1) 下载真实应用程序和黑客的应用程序(两者),则虚假应用程序可以侦听真实应用程序回调并从中获取授权代码。通过授权代码(来自回调)和客户端密钥(通过反编译我的应用程序窃取),黑客可以获取授权令牌和刷新令牌,并能够获取 User1 的数据等。

如果其他用户下载真假应用程序,他们的数据也将面临危险。我对吗?黑客是否需要两者,或者他/她是否可以仅使用授权代码进行攻击?镜像的第五步需要客户端密钥和授权码吗?

这种攻击称为拦截攻击。

在此输入图像描述

为了解决公共客户端应用程序中硬编码客户端密钥的问题,使黑客无法获取客户端密钥并窃取令牌,发明了 PKCE。使用 PKCE,客户端应用程序代码不需要对客户端密钥进行硬编码,因为 PKCE 不需要该信息来获取最终用户的令牌。

PKCE 流程创建一个随机字符串,将其转换为SHA-256哈希值和 Base64。在图像的第二点中,该编码字符串与客户端 id一起发送到身份验证服务器。然后,授权代码在回调中发送,如果任何恶意应用程序拦截该代码,它将无法获取令牌,因为图像的第五点需要由合法应用程序创建的原始随机字符串。

这很好,但如果不再需要客户端密钥来获取令牌来访问 User1 数据,我如何避免黑客开发一个假应用程序,该应用程序使用 PKCE 流和我的客户端 ID 并获取用户的令牌认为该应用程序是合法的?

由于图像的第五步不再需要客户端密钥来获取令牌,任何人都可以使用我的公共客户端 ID 开发虚假应用程序,如果任何用户下载虚假应用程序并执行 OAuth 流程,黑客就可以获取它的令牌并访问该用户的数据!

我对吗?

Jon*_*nas 3

如果不再需要客户端密钥来获取令牌来访问 User1 数据,我如何避免黑客开发一个假应用程序,该应用程序使用 PKCE 流和我的客户端 ID 并获取认为该应用程序是合法的用户的令牌一?

OAuth 2.0 或 PKCE 无法防范“虚假应用程序”。

PKCE 确实可以防止设备上的恶意应用程序窃取用于其他应用程序的令牌。例如,考虑一个银行应用程序,如果设备上的另一个应用程序可以获得银行应用程序正在使用的令牌,那就不好了。这就是您图片中所示的情况,并且 PKCE 可以缓解这种情况。

由于图像的第五步不再需要客户端密钥来获取令牌,因此任何人都可以使用我的公共客户端 ID 开发虚假应用程序。

与 JavaScript 单页应用程序类似,移动应用程序无法保护客户端机密。因此,根据 OAuth 2.0,这些客户端是公共客户端而不是机密客户端。只有机密客户端才能以安全的方式保护客户端机密,只有那些才应该使用客户端机密PKCE 对于公共客户端来说是一种很好的技术,但也可以用于机密客户端

如果任何用户下载假冒应用程序并执行 oauth 流程,黑客就可以获取其令牌并访问该用户数据!

请联系 Apple Store 或 Google Play 商店查找“虚假应用程序”,或使用反恶意软件应用程序等。这就是针对“虚假应用程序”的缓解措施。PKCE 仅在同一设备上的另一个应用程序尝试窃取为另一个应用程序(例如银行应用程序)颁发的令牌时缓解这种情况。

  • 这是否意味着没有完全可靠的方法来为本机应用程序设置安全的 oauth? (2认同)