移动 OAuth 授权流程
在我的应用中,我需要传递 client_id 和 client_secret 来进行 API 调用。
在我看来,您没有在移动应用中使用正确的 OAuth 授权流程,因为您现在使用的需要 client_secret。我认为您可能正在尝试使用用于m2m(machine to machine) 授权的流程。
适用于移动应用的正确流程是带有代码交换证明密钥 (PKCE) 的授权代码流程。
来自auth0.com/docs:
PKCE 增强的授权代码流程引入了一个由调用应用程序创建的秘密,该秘密可以由授权服务器验证;这个秘密被称为代码验证器。此外,调用应用程序创建称为代码质询的代码验证器的转换值,并通过 HTTPS 发送此值以检索授权代码。这样一来,恶意攻击者只能截获授权码,没有验证码就无法将其换成令牌。
您可以读到这是 OAuth 2.0 RFC8252 中针对原生应用程序的推荐方法,即关于移动应用程序的最佳实践:
摘要
仅应发出来自本机应用的 OAuth 2.0 授权请求
通过外部用户代理,主要是用户的浏览器。这
规范详细说明了这样做的安全性和可用性原因
案例以及本机应用程序和授权服务器如何实现
这个最佳实践。
本备忘录的状态
本备忘录记录了 Internet 最佳当前实践。
本文档是 Internet 工程任务组的产品
(IETF)。它代表了 IETF 社区的共识。它有
已接受公众审查并已被批准出版
互联网工程指导组 (IESG)。更多信息
BCP 可在 RFC 7841 的第 2 节中找到。
有关本文档当前状态的信息、任何勘误表、
以及如何提供反馈可以在
https://www.rfc-editor.org/info/rfc8252.
在移动应用中安全存储机密
在 Android 应用上存储 client_id 和 client_secret 的最安全方式是什么?
另请阅读有关 Keystore 的信息,但不确定这是否是正确的方法。您能否建议存储此类信息的最安全方式?
是的,Android Keystore 是正确的选择。您可以从Android Security Library 使用它来存储您的秘密,但请记住,攻击者可以使用检测框架在运行时挂钩到使用已解密的client_id 和client_secret 的代码并提取它们以供外部使用您的移动应用程序。用于此提议的流行检测框架是Frida:
将您自己的脚本注入黑盒进程。挂钩任何功能、监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,立即查看结果。所有这些都无需编译步骤或程序重新启动。
我邀请您阅读my answer 问题在 Android 中安全地存储客户端证书和密钥 (.pem),以了解有关将 Android 密钥库与安全库一起使用的更多详细信息以及答案包括一些代码示例。
你想加倍努力吗?
在回答安全问题时,我总是喜欢参考 OWASP 基金会的出色工作:
OWASP Mobile Security Project - Top 10 risks
OWASP 移动安全项目是一个集中资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类并提供开发控制以减少其影响或被利用的可能性。
OWASP - Mobile Security Testing Guide:
移动安全测试指南 (MSTG) 是一本用于移动应用安全开发、测试和逆向工程的综合手册。