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

Understanding benefits of PKCE vs. Authorization Code Grant

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

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

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

如果其他用户同时下载真假应用,他们的数据也将处于危险之中。我对吗?黑客是需要两者还是 he/she 只使用授权码进行攻击?图片第五步需要client secret和授权码吗?

这种攻击称为拦截攻击。

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

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

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

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

我说得对吗?

if the client secret isn't need anymore to get the tokens to access User1 data, how can I avoid a hacker developing a fake App which use PKCE flow with my client id and getting the tokens of the users who think that app is the legitimate one?

OAuth 2.0 或 PKCE 无法防止“虚假应用”。

PKCE 确实可以防止设备上的恶意应用程序窃取用于另一个应用程序的令牌。例如。想想银行应用程序,如果设备上的另一个应用程序可以获得银行应用程序正在使用的令牌,那就不好了。这就是您图片中说明的情况,PKCE 对此进行了缓解。

As the 5th step of the image don't need anymore the client secret to get the tokens, anyone could develop fake apps using my public client id.

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

if any user downloads the fake app and do the oauth flow, the hacker could get it's tokens and access that users data!

联系 Apple Store 或 Google Play 商店购买“虚假应用”,或使用例如Anti-malware 个应用程序。这就是针对“假应用程序”的缓解措施。 PKCE 仅缓解同一设备上的另一个应用程序试图窃取为另一个应用程序(例如银行应用程序)颁发的令牌的情况。