在Android应用中安全存储client_id和client_secret的方式 摘要此备忘录的状态

问题描述

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

在Android应用中存储 client_id client_secret 的最安全的方法是什么?

我已阅读有关 SharedPreferences 的信息,并且我确信它们不安全。另请阅读有关 Keystore 的信息,但不确定这是否正确。您能否建议存储这些信息的最安全方法是什么?

谢谢 R

解决方法

最好的方法是使用Android的Keystore。它将为您处理密钥生成和存储。您的应用将通过KeyChain API进行通信,该API具有以下优点:

  • 它为您执行所有加密操作
  • 很难从设备中提取
  • 每个应用只能访问自己的密钥(由Keystore强制执行)

enter image description here

在钥匙串中保护用户的秘密

,

移动OAuth授权流程

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

在我看来,您没有在移动应用中使用正确的OAuth授权流程,因为您正在使用的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)。有关更多信息 RFC 7841的第2节提供了BCP。

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

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

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

是的,Android Keystore是正确的选择。您可以从Android Security Library中使用它来存储您的机密,但请记住,攻击者可以在运行时使用检测框架将其插入使用已解密的client_idclient_secret的代码中并提取它们以在您的移动应用程序之外使用。用于此提议的一种流行的检测框架是Frida

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

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

您想走多远吗?

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

OWASP Mobile Security Project - Top 10 risks

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

OWASP - Mobile Security Testing Guide

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...