在 Android 应用程序上存储 client_id 和 client_secret 的安全方法

BRD*_*oid 3 java security android kotlin android-security

在我的应用程序中,我需要传递client_idclient_secret来进行 API 调用。

在 Android 应用程序上存储client_idclient_secret最安全的方法是什么?

我读过有关SharedPreferences 的内容,我确信它们不安全。另请阅读有关密钥库的信息,但不确定这是否是正确的方法。您能否建议存储此类信息最安全的方式是什么?

谢谢R

Exa*_*a37 5

移动 OAuth 授权流程

在我的应用程序中,我需要传递 client_id 和 client_secret 来进行 API 调用。

在我看来,您没有在移动应用程序中使用正确的 OAuth 授权流程,因为您现在使用的授权流程需要client_secret. 我认为您可能正在尝试使用用于授权的流程m2m(machine to machine)

用于移动应用程序的正确流程是带有代码交换证明密钥 (PKCE) 的授权代码流程。

来自auth0.com/docs

PKCE 增强型授权代码流引入了由调用应用程序创建的秘密,该秘密可由授权服务器验证;这个秘密称为代码验证器。此外,调用应用程序还会创建一个名为“代码质询”的代码验证器转换值,并通过 HTTPS 发送该值以检索授权代码。这样,恶意攻击者只能拦截授权码,而无法在没有代码验证器的情况下将其交换为令牌。

您可以看到这是 OAuth 2.0 RFC8252 for Native Apps 中推荐的方法,即关于移动应用程序的最佳实践:

抽象的

来自本机应用程序的 OAuth 2.0 授权请求只能通过外部用户代理(主要是用户的浏览器)发出。本规范详细说明了这种情况的安全性和可用性原因,以及本机应用程序和授权服务器如何实现此最佳实践。

本备忘录的状态

本备忘录记录了当前互联网最佳实践。

本文档是互联网工程任务组 (IETF) 的产品。它代表了IETF社区的共识。它已接受公众审查,并已被互联网工程指导小组 (IESG) 批准发布。有关 BCP 的更多信息,请参阅 RFC 7841 第 2 节。

有关本文档当前状态、任何勘误表以及如何提供反馈的信息,请访问 https://www.rfc-editor.org/info/rfc8252

在移动应用程序中安全地存储机密

在 Android 应用程序上存储 client_id 和 client_secret 最安全的方法是什么?另请阅读有关密钥库的信息,但不确定这是否是正确的方法。您能否建议存储此类信息最安全的方式是什么?

是的,Android 密钥库是正确的方法。您可以使用Android 安全库中的它来存储您的机密,但请记住,攻击者可以使用检测框架在运行时挂钩到使用已解密的代码,并将其提取出来以便在您的移动应用程序之外使用client_idclient_secret用于此建议的流行仪器框架是Frida

将您自己的脚本注入黑盒进程。挂钩任何函数、监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,然后立即看到结果。全部无需编译步骤或程序重新启动。

我邀请您阅读我对“在 Android 中安全地存储客户端证书和密钥 (.pem)”问题的回答,以了解有关将 Android 密钥库与安全库一起使用的更多详细信息,答案包括一些代码示例。

您想加倍努力吗?

在回答安全问题时,我总是喜欢引用 OWASP 基金会的出色工作:

OWASP 移动安全项目 - 十大风险

OWASP 移动安全项目是一个集中资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类并提供开发控制以减少其影响或被利用的可能性。

OWASP - 移动安全测试指南

移动安全测试指南 (MSTG) 是移动应用安全开发、测试和逆向工程的综合手册。