如何通过哈希比较限制 API 密钥的使用

2024-01-11

我目前正在使用Spotify in my Android应用程序,但我需要使用Secret为了刷新令牌等等。我想传达我的秘密Backend到应用程序,因此秘密并不驻留在APK并且反编译时找不到。我读过很多关于保护应用程序中的秘密的内容,通过代理等各种方式,仅使用您自己的后端,将代码放入应用程序中的本机 C++ 代码 (NDK) 或使用应用程序的哈希来确定是否应用程序正在调用后端,而不是他的计算机后面的某个人试图窃取秘密。

找到选项:

  • 代理:这意味着通过我自己的服务器路由它,不希望这样
  • 自己的后端:与代理相同,不希望所有请求都通过我自己的服务
  • 本机代码:使用它似乎会减慢反编译器的速度,但不会阻止它们
  • 哈希:据我所知,this https://stackoverflow.com/questions/33989062/restricting-usage-for-an-android-key-for-a-google-api/42851756#42851756帖子提出了一些我认为奇怪的事情。它正在检索 SHA-1 并将其传递到网络标头中以验证应用程序是否正在调用。奇怪的是,当你只是unzipAPK 文件,运行 printcert (keytool -printcert -file CERT.RSA) 命令将显示 APK 的所有 SHA 和 MD5 哈希值。据我所知,这并不是万无一失的,因为有人可以获取 APK 文件的哈希值并将其提交到服务器。

我还有其他方法可以解决这个问题吗?


你的问题

我目前在 Android 应用程序中使用 Spotify,但我需要使用 Secret 才能刷新令牌等。我想将秘密从我的后端传输到应用程序,因此秘密不驻留在APK中,并且在反编译时无法找到。我读过很多关于保护应用程序中的秘密的内容,通过代理等各种方式,仅使用您自己的后端,将代码放入应用程序中的本机 C++ 代码 (NDK) 或使用应用程序的哈希来确定是否应用程序正在调用后端,而不是他的计算机后面的某个人试图窃取秘密。

恭喜您努力理解这个问题,似乎您在很大程度上了解了移动应用程序中的秘密始终可以通过静态二进制分析来提取,但我没有看到任何提到的仪器框架,例如:

Frida https://www.frida.re/

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

or

xPosed https://repo.xposed.info/module/de.robv.android.xposed.installer

Xpose 是一个模块框架,可以在不接触任何 APK 的情况下更改系统和应用程序的行为。这很好,因为这意味着模块可以适用于不同的版本,甚至无需任何更改的 ROM(只要原始代码没有更改太多)。它也很容易撤消。

但还有许多其他的存在,并且所有这些都将在运行时连接到您的代码并提取您存储在移动应用程序中的任何秘密,无论您存储它的安全程度如何,即使您使用硬件支持的密钥库(在可信执行中运行)环境:

Android 硬件支持的密钥库 https://source.android.com/security/keystore

片上系统 (SoC) 中可信执行环境的可用性为 Android 设备提供了向 Android 操作系统、平台服务甚至第三方应用程序提供硬件支持的强大安全服务的机会。

在某些时候,从该密钥库检索到的秘密将需要用于向第三方服务发出请求,此时攻击者所需要做的就是挂钩对该函数的调用并在传递到时提取秘密它。

因此,无论你最终做什么,移动应用程序中的秘密始终可以被提取,这仅取决于攻击者的技能以及他愿意投入的时间和精力。

话虽如此,这让我意识到我总是建议开发人员不要这样做,那就是从他们的移动应用程序中调用第三方服务。

从移动应用程序访问第三方服务

找到选项:

代理:这意味着通过我自己的服务器路由它,不希望这样 自己的后端:与代理相同,不希望所有请求都通过我自己的服务

是的,我了解到您不想使用代理或后端,但这是您确保访问第三方服务(在本例中为 Shopify)的最佳机会。

I wrote 本文 https://blog.approov.io/using-a-reverse-proxy-to-protect-third-party-apis这解释了为什么你不应该从你的移动应用程序中执行此操作,我引用的是:

一般来说,所有第三方 API 都需要 API 密钥、访问令牌或某种其他机制形式的秘密,以便远程客户端向其希望与之通信的后端服务器识别自己的身份。这就是从移动应用程序中访问它的问题的症结所在,因为您需要在代码中发送所需的秘密(上图中的彩色键)。

现在您可能会说您已经混淆了代码中的秘密,将其隐藏在本机 C 代码中,在运行时动态组装它,甚至对其进行了加密。然而,最终攻击者为了提取这个秘密所需要做的就是反向工程 https://blog.approov.io/how-to-extract-an-api-key-from-a-mobile-app-with-static-binary-analysis具有静态二进制分析的二进制文件,或者挂钩诸如Frida https://frida.re/在运行时进入函数,该函数将返回秘密。或者,攻击者可以通过执行以下命令来检查移动应用程序与其连接的第三方 API 之间的流量:MitM(中间人) https://blog.approov.io/steal-that-api-key-with-a-man-in-the-middle-attack.

攻击者掌握了秘密,就可以对组织造成很大的损害。损害可能是金钱、声誉和/或监管方面的。从经济上来说,攻击者可以使用提取的秘密来访问您的云提供商以及您名下的按调用付费的第三方 API,从而给您带来额外的成本。此外,您可能会因数据泄露而遭受经济损失,这些数据可能会出售给您的竞争对手或用于实施欺诈。当攻击者使用提取的秘密在社交网络上代表您发布信息时,您的声誉可能会受到影响,从而造成公共关系噩梦。当攻击者使用第三方 API 并违反其条款和条件(例如,频繁使用 API 触发速率限制)时,可能会发生另一种声誉损害,从而导致您无法使用该服务,从而给最终用户带来痛苦。最后但并非最不重要的一点是,当提取的机密是保护第三方 API 访问机密信息的唯一机制时,会引起监管问题。如果攻击者可以检索个人身份信息 (PII) 等机密信息,您的企业可能会因违反欧洲 GDPR 或加利福尼亚州新 CCPA 数据隐私法而被处以监管罚款。

因此,最重要的信息是,从您发布应用程序或将代码推送到公共存储库的那一刻起,您在代码中传递的任何秘密都必须被视为公开。到目前为止,应该清楚的是,最好的方法是完全避免从移动应用程序内访问第三方 API;相反,您应该始终将此访问权限委托给您可以信任和控制的后端,例如反向代理。

您现在可能会说问题刚刚从移动应用程序转移到反向代理或后端服务器,这是一件积极的事情,因为后端或反向代理在您的控制之下,但移动应用程序超出了您的控制范围,因为它位于客户端,因此攻击者可以用它做任何他想做的事。

在后端或反向代理中,您不会向公众公开访问第三方服务的秘密,并且攻击者想要代表您对该第三方服务进行的任何滥用都需要通过您控制的位置,因此您可以应用尽可能多的防御机制,并且这是法律针对您的用例所要求的。

深度安全

将代码放入本机 C++ 代码 (NDK)

当在本机 C 代码中隐藏秘密时,通过静态二进制分析很难找到它,至少对于脚本小子和季节性黑客来说,它需要大多数人可能不具备的更好的技能,因此我强烈建议您将其用作额外的安全层,但为了保护访问您自己的服务的秘密,而不是像我之前提到的第三方服务。

如果您真的决定听从我的建议,并将您的努力转移到您可以控制的地方(例如您自己的后端),那么我建议您阅读我的答案 https://stackoverflow.com/questions/60559419/how-to-secure-an-api-rest-for-mobile-app-if-sniffing-requests-gives-you-the-k/60605789#60605789对这个问题如何保护移动应用程序的 API REST 安全?对于以下部分保护 API 服务器的安全 and 一个可能更好的解决方案。

如果您阅读了上述答案,那么您已经意识到,如果您在后端保留对第三方服务的访问权限,则可以通过使用移动应用程序证明概念,以非常高的置信度将 API 服务器锁定到您的移动应用程序。

您想加倍努力吗?

我看到您消息灵通,因此您已经知道我要分享的内容,但在我对安全问题的任何回复中,我总是喜欢参考 OWASP 基金会的出色工作,因此如果您允许,我会这样做到这里:)

对于移动应用程序

OWASP 移动安全项目 - 十大风险 https://www.owasp.org/index.php/OWASP_Mobile_Security_Project#Top_Ten_Mobile_Risks

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

OWASP - 移动安全测试指南 https://github.com/OWASP/owasp-mstg:

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

For APIS

OWASP API 安全性前 10 名 https://github.com/OWASP/API-Security

OWASP API 安全项目旨在通过强调不安全 API 的潜在风险并说明如何减轻这些风险,为软件开发人员和安全评估人员提供价值。为了实现这一目标,OWASP API 安全项目将创建并维护十大 API 安全风险文档,以及创建或评估 API 时最佳实践的文档门户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过哈希比较限制 API 密钥的使用 的相关文章

  • 我可以为 Android Activity 分配“默认”OnClickListener() 吗?

    我有一个 Activity 对于布局中的每个小部件 我调用 setOnClickListener 来分配我的 OnClick 处理程序 在我的 OnClick 处理程序中 我使用 switch 语句根据 View 参数的 ID 为每个按钮执
  • 如何使用 node.js 请求模块使用我自己的证书进行 SSL 调用?

    我正在使用 node js 和此请求模块对另一台服务器进行 HTTP 调用 https github com mikeal request https github com mikeal request 效果很好 我现在需要修改此代码以使用
  • Android 从图库中选择图像显示内存错误

    我正在编写一个代码示例 我必须从图库中选择一个图像 该代码正在运行 但是在从图库中选择图像后 我得到了内存不足错误 in my 活动结果时 我可以获得小图像 但大图像会产生问题 这是我的代码 try Uri selectedImageUri
  • 如何在 PercentRelativeLayout 中使用layout_aspectRatio?

    我尝试在视图上实现 16 9 的纵横比PercentRelativeLayout https developer android com reference android support percent PercentRelativeLa
  • Android 堆栈大小

    我如何获取和更改 Android 应用程序的堆栈大小 即使是主线程 主线程堆栈大小是在固件中设置的 无法修改 除非修改您自己手机的固件 正如斯特朗先生指出的那样 对于您分叉的线程 您可以设置自己的堆栈大小
  • 我的手机设备上的 adb shell:出现奇怪的字符(终端颜色问题)

    我有一台配备 DarkyRom 10 4 2 XWJW1 Android 2 3 6 和 root 访问权限的 Samsung Galaxy S 我正在实现一个应用程序 我想使用 eclipse 在手机中执行它 但出现错误 Activity
  • 显示葡萄牙语字符 Android

    我正在开发一个 Android 应用程序 当它应该写 n o 或 cabe a 等单词 例如带有 或 的字符 时 它会写 或 我已经检查过源文件编码 它是UTF 8 看起来 UTF8 被解释为 ISO 8859 x 理论上 你可以提供 ja
  • Android:如何根据视图模型实时数据属性为片段编写单元测试?

    我的片段 UI 中有一个列表视图 其元素集取决于来自视图模型 LiveData 属性的值的状态 我想为片段创建工具测试 该片段包含与该属性的值集相关的 3 个场景测试用例 但我不知道从哪里开始 我的代码应该如下所示 class MyView
  • 如何在Android Studio中安装android 6.0.1模拟器?

    我在我的 Android 模拟器上遇到这个问题E Surface getSlotFromBufferLocked 未知缓冲区 0xab7519c0 https stackoverflow com questions 33046375 e s
  • Android 操作系统上的 NFC 堆栈

    有人可以帮助我了解 NFC Android 堆栈的当前状态吗 随着OS 2 3发布了小型 NFC 支持 仅限于 NXP 标签读取 后来 Google 增强了 API 所以在OS 2 3 3支持更广泛的标签 并且还可以使用 p2p 我的问题是
  • 使用 Kotlin 协程替换 LocalBroadcastManager 以进行 Firebase 消息传递

    使用时Firebase 云消息传递 https firebase google com docs cloud messaging android client在 Android 上 通常需要通知当前Activity传入的推送通知 推荐的方法
  • 改造添加带有令牌和 ID 的标头

    我在获取经过身份验证的用户时遇到问题 在此之前我得到了令牌和用户 ID 现在我需要使用访问令牌和 ID 从服务器获取用户 我有标题格式 https i stack imgur com OQ87Y png 现在我尝试使用拦截器添加带有用户令牌
  • Android Studio 1.0 在 dexDebug 或 dexRelease 上构建失败

    我最近从 Android Studio 0 9 2 升级到 1 0 包括 Gradle 插件版本 1 0 0 并且在构建项目时遇到问题 每当我构建时 我都会在 dexDebug 或 dexRelease 步骤中收到以下异常 UNEXPECT
  • 超慢的表格布局性能

    我遇到了糟糕的 TableLayout 性能 我在这里读过一些帖子 谈论同样的事情 Android 动态创建表 性能不佳 https stackoverflow com questions 9813427 android dynamical
  • libgdx SpriteBatch 渲染到纹理

    是否可以使用 libGdx 适用于 Android 桌面的 Java 引擎 中的 SpriteBatch 渲染到纹理 如果是这样 怎么办 基本上我想将所有内容渲染到 512 x 256 纹理的 320 x 240 区域 然后缩放区域以适合屏
  • 出于安全目的,您是否有理由不执行自己的算法来打乱 ID?

    我计划实现我自己的非常简单的 哈希 公式 为具有多个用户的应用程序添加一层安全性 我目前的计划如下 用户创建一个帐户 此时后端会生成一个 ID ID 通过公式运行 假设 ID 57 8926 36 7 或同样随机的东西 然后 我将新的用户
  • Android:列表视图崩溃

    我正在使用 android listview 并且它工作得很好 我的实现如下 ListView listview ListView findViewById R id list setListAdapter new ArrayAdapter
  • 膨胀类 android.support.design.internal.BottomNavigationView 时出错

    我正在制作我的第一个应用程序 这是一个简单的应用程序 带有启动屏幕和主要活动 现在我有两个构建变体 免费版本 活动底部有 Admob 横幅 付费版本 该应用程序不会在底部显示 admob 横幅 而是将其替换为用于切换活动的底部导航视图 我将
  • 如何在 Android 上设置 Google Drive API?

    我一直在尝试将 Google Drive 功能集成到我的应用程序中 但我无法使用任何内置功能 因此我相信我要么错过了一个步骤 要么做得不正确 我正在遵循官方的 Google 开发者指南 https developers google com
  • 智能手机可以通过 3G/4G 进行点对点通信吗?

    我正在尝试编写一个应用程序 将数据从一个 Android 设备传输到另一个 Android 设备 但这些设备很可能位于城市 州或国家的不同部分 直接的方法是拥有一台中央服务器 或任何类型的服务器 但我试图避免使用中央服务器 我试图传递的数据

随机推荐

  • 由于缺少 android SDK,Jenkins 构建失败

    正如标题所示 我的 jenkins 构建由于找不到 android sdk 而失败 尽管它位于环境路径中 这是控制台日志 Started by user anonymous Building in workspace Users lmnap
  • OpenCV 根据像素值调整图像大小和裁剪图像

    include iostream include cv h include highgui h include cvaux h include cxmisc h include math h using namespace cv using
  • 访问Mac的传感器数据

    有没有办法使用 Python 和 或 C 在 Mac 上获取环境光传感器数据 谷歌了一下 没有找到太多信息 大部分信息都与 Objective C 有关 这看起来并不简单 您可能需要使用 C C 来制作 swig 组件 这是一个读取突然运动
  • 在 mac 上将 VS code 与 TFS 连接

    如何连接视觉工作室代码 on mac with 团队基础服务器 TFS 或者有其他方式连接tfs吗 以下是将 TFS TFVC 存储库有效连接到 Mac 上的 VS Code 的步骤 安装软件 安装 Visual Studio Code f
  • 检查对象是否有用户定义的原型?

    简而言之 我可以检查一个对象是否具有用户定义的原型吗 Example var A function var B function B prototype Pseudocode A hasUserPrototype False B hasUs
  • 如何使用 setText() 在自定义布局对话框中编辑文本

    我有一个自定义对话框布局中的 TextView 当对话框即将出现时 必须更改其文本
  • 无法反序列化当前 JSON 对象,为什么?

    我正在尝试使用 WebApi 从我的数据库中获取员工列表 使用以下代码 这是我的客户端 MVC 应用程序的代码 string u http localhost 1411 api EmployeeAPI Uri uri new Uri u H
  • Javascript 范围 addEventListener 和 this

    我是一名 C 开发人员 正在尝试 JavaScript 我正在尝试了解范围 我有以下代码 其中包含addEventListener我想在其中使用我的对象中的字段 function window function Keyboard this
  • 为 exec ANT 任务启用控制台输出

    在 Eclipse 中 我使用以下 Macrodef 启动一个 html 页面 其中嵌入了 ANT 中的 swf
  • 对两个黑白图像进行异或并求和

    从两张图像开始im1 and im2使用PIL模块创建 我们有相应的黑白图像 bw im1 im1 convert 1 and bw im2 im2 convert 1 每个像素的bw im2 and bw im2是 0 或 256 假设两
  • Google Analytics 实时如何工作?

    我想知道 Google Analytics 实时用户界面是如何工作的 技术是什么 他们是否使用客户端的长轮询 通过将实时信息从服务器传送到客户端来保持 UI 统计数据即时更新 我刚刚在网络选项卡上打开 Chrome 开发工具 并且有一个无限
  • IIS 7.0 上的 ETag

    IIS 中的 Etag 是否默认启用 如果没有 请告诉我如何打开它们 Etag 开启 默认设置为 0 http attosol com etag and iis demystified http attosol com etag and i
  • Python 更新 Github 远程存储库上的文件,无需本地工作目录

    这是关于在没有本地工作目录的情况下推送到远程存储库的问题的后续问题 Python 将文件推送到 Github 远程仓库 无需本地工作目录 https stackoverflow com questions 39737192 python p
  • Python - 将 CSV 转换为对象 - 代码设计

    我有一个小脚本 用于读取包含员工的 CSV 文件 并对这些数据执行一些基本操作 我们读入数据 import gd dump 并创建一个Employees对象 包含一个列表Employee对象 也许我应该想一个更好的命名约定 哈哈 然后我们调
  • 作为图形 IDE 用户,我应该对传统编辑器感兴趣吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何确定节点中用户的IP地址

    如何确定控制器内给定请求的 IP 地址 例如 快递 app post get ip address function req res need access to IP address here In your request https
  • 使用来自 C99 的库在 Windows 上使用 TCC 编译文件

    所以最新版本的TCC据说实现了C99的一些功能 但是 我发现它不包括C99的数学库 有没有办法让它在 Windows 上使用更多 C99 的库 我用 google 搜索了一下 发现了一些主要与 Linux 相关的建议 但对于这个项目 我需要
  • org.apache.http.conn.HttpHostConnectException:与 https://jazz.net 的连接被拒绝

    我已将我的工作灯从 5 0 5 升级到 5 0 6 当我在 5 0 5 上工作时 它工作正常 但当我在更新版本的工作灯 5 0 6 中使用相同的代码时 它给了我这个错误 响应 apps services api RTMLight commo
  • 从 XCode 中的 .strings 文件读取字符串

    我是 iOS 新手 我有一个 strings 文件 其中存储了一个免责声明 当我的应用程序打开时可以查看该免责声明 但是 我无法弄清楚如何从 disclaimer strings 文件中调用 免责声明 字符串 如有帮助 将不胜感激 另外 感
  • 如何通过哈希比较限制 API 密钥的使用

    我目前正在使用Spotify in my Android应用程序 但我需要使用Secret为了刷新令牌等等 我想传达我的秘密Backend到应用程序 因此秘密并不驻留在APK并且反编译时找不到 我读过很多关于保护应用程序中的秘密的内容 通过