移动后端API密钥的安全性

2024-04-16

假设我正在开发一个调用 API 服务器的移动应用程序。 API 服务器由 API 密钥保护。

我无法在移动应用程序中对 API 密钥进行硬编码,因为它可能会被盗。

如何保护 API 密钥?


假设我正在开发一个调用 API 服务器的移动应用程序。 API 服务器由 API 密钥保护。

首先让我们澄清开发人员中关于 API 的一个非常常见的误解......

与您的 API 服务器通信的人与物之间的区别

为了更好地理解之间的差异WHOWHAT正在访问您的移动应用程序,让我们使用这张图片:

预期通信通道代表您的移动设备按您的预期使用,由合法用户使用,没有任何恶意,使用您的移动应用程序的未篡改版本,并直接与您的 API 服务器通信,而不会受到中间人攻击。

实际渠道可能代表几种不同的场景,例如具有恶意意图的合法用户可能正在使用您的移动应用程序的重新打包版本,黑客使用您的移动应用程序的正版,而中间人对其进行攻击以了解通信方式移动应用程序和 API 服务器之间的交互正在完成,以便能够自动攻击您的 API。许多其他场景也是可能的,但我们不会在这里一一列举。

我希望现在你可能已经知道为什么WHOWHAT不一样,但如果不一样,一会儿就会清楚。

The WHO是移动应用程序的用户,我们可以通过多种方式对其进行身份验证、授权和识别,例如使用 OpenID Connect 或 OAUTH2 流。

OAUTH https://en.wikipedia.org/wiki/OAuth

一般来说,OAuth 代表资源所有者向客户端提供对服务器资源的“安全委托访问”。它指定了资源所有者授权第三方访问其服务器资源而无需共享其凭据的流程。 OAuth 专为与超文本传输​​协议 (HTTP) 配合使用而设计,本质上允许授权服务器在资源所有者的批准下向第三方客户端颁发访问令牌。然后,第三方使用访问令牌来访问资源服务器托管的受保护资源。

OpenID 连接 https://openid.net/connect/

OpenID Connect 1.0 是 OAuth 2.0 协议之上的简单身份层。它允许客户端根据授权服务器执行的身份验证来验证最终用户的身份,并以可互操作和类似 REST 的方式获取有关最终​​用户的基本配置文件信息。

虽然用户身份验证可能会让您的 API 服务器知道WHO正在使用 API,它不能保证请求源自WHAT您期望的,您的移动应用程序。

现在我们需要一种方法来识别WHAT正在调用您的 API 服务器,这里事情变得比大多数开发人员想象的更加棘手。这WHAT是向 API 服务器发出请求的东西。它真的是您的移动应用程序的真实实例,还是机器人、自动化脚本或攻击者使用 Postman 等工具手动侵入您的 API 服务器?

令您惊讶的是,您最终可能会发现,它可能是您的合法用户之一,使用您的移动应用程序的重新打包版本或尝试游戏化并利用您的服务的自动化脚本。

那么,要识别WHAT,开发人员倾向于使用 API 密钥,通常他们将其硬编码在移动应用程序的代码中。一些开发人员付出了额外的努力,在移动应用程序的运行时计算密钥,因此它成为运行时秘密,而不是当静态秘密嵌入到代码中时的前一种方法。

以上内容摘自我写的一篇文章,题为为什么您的移动应用程序需要 API 密钥?,并且您可以完整阅读here https://blog.approov.io/why-does-your-mobile-app-need-an-api-key,这是有关 API 密钥的系列文章中的第一篇文章。

你的问题

因此,您的问题无法通过身份验证/授权服务器来解决,无论它是否使用 Oauth、OpenID 或任何其他类型的身份验证,因为正如您现在可能已经了解的那样,该服务器只会识别WHO正在访问您的 API 服务器,而不是WHAT正在访问它。

需要澄清的是,我并不是说不应该使用这种方法,事实上使用 Oauth2/OpenID 是识别身份的最佳方法。WHO正在访问 API 服务器。

现在您可能正在思考如何解决您的问题:

我无法在移动应用程序中对 API 密钥进行硬编码,因为它可能会被盗。

好吧,你给自己买了一个头痛,没有医生或药物可以让它消失。

确实,如果您在移动应用程序中隐藏任何秘密,那么它就可以被逆向工程。在本文 https://blog.approov.io/how-to-extract-an-api-key-from-a-mobile-app-with-static-binary-analysis我写了一篇关于在移动应用程序中隐藏 API 密钥的最有效方法之一,方法是使用JNI/NDK https://developer.android.com/training/articles/perf-jni,但同时我也写了如何对其进行逆向工程:

现在是时候寻找一种更先进的技术来隐藏 API 密钥,这种方式很难从 APK 进行逆向工程,为此,我们将通过利用 JNI 使用本机 C++ 代码来存储 API 密钥在底层使用 NDK 的接口。

在我开始回答你的问题之前,我完成了下一篇文章的草稿,该文章将介绍如何执行中间人攻击来窃取 API 密钥,你将能够阅读到与此相关的内容:

虽然我们可以使用 JNI/NDK 等先进技术在移动应用程序代码中隐藏 api 密钥,但它不会阻止某人执行 MITM 攻击以窃取 api 密钥。事实上,MITM 攻击非常简单,甚至非开发人员也可以实现。

我是否告诉您,保护 API 服务器免受攻击是没有希望的?WHAT正在访问它?好吧,不,我不是……

可能的解决方案

如何保护 API 密钥?

移动应用程序应仅与您控制下的 API 服务器通信,并且对第三方 API 服务的任何访问都必须由您控制的同一 API 服务器完成。

通过这种方式,您可以将攻击面限制在一个地方,在那里您可以根据您所保护的内容的价值采用尽可能多的防御层。

根据您尝试保护的 ​​API 密钥背后的值,您可能需要使用网络应用防火墙 https://en.wikipedia.org/wiki/Web_application_firewall(WAF),如果你能负担得起用户行为分析 https://en.wikipedia.org/wiki/User_behavior_analytics(UBA)解决方案。

WAF - Web应用程序防火墙 https://en.wikipedia.org/wiki/Web_application_firewall:

Web 应用程序防火墙(或 WAF)过滤、监视和阻止进出 Web 应用程序的 HTTP 流量。 WAF 与常规防火墙的区别在于,WAF 能够过滤特定 Web 应用程序的内容,而常规防火墙则充当服务器之间的安全门。通过检查 HTTP 流量,它可以防止源自 Web 应用程序安全缺陷的攻击,例如 SQL 注入、跨站点脚本 (XSS)、文件包含和安全错误配置。

UBA-用户行为分析 https://en.wikipedia.org/wiki/User_behavior_analytics:

Gartner 定义的用户行为分析 (UBA) 是一个关于检测内部威胁、针对性攻击和金融欺诈的网络安全流程。 UBA 解决方案着眼于人类行为模式,然后应用算法和统计分析从这些模式中检测有意义的异常,即表明潜在威胁的异常。 UBA 不跟踪设备或安全事件,而是跟踪系统的用户。 Apache Hadoop 等大数据平台正在增强 UBA 功能,允许它们分析 PB 级数据以检测内部威胁和高级持续威胁。

所有这些解决方案都基于负面识别模型,换句话说,他们尽力通过识别什么是坏的而不是什么是好来区分好坏,因此尽管使用了先进的技术,但它们很容易出现误报其中一些,如机器学习和人工智能。

因此,您可能会经常发现自己必须放松阻止对 API 服务器的访问的方式,以免影响好用户。这也意味着该解决方案需要持续监控,以验证误报不会阻止合法用户,同时正确阻止未经授权的用户。

对于为移动应用程序提供服务的 API,可以通过使用移动应用程序证明解决方案来使用肯定的识别模型,该解决方案向 API 服务器保证请求可以被信任,而不会出现误报。

移动应用程序认证

移动应用程序证明服务的作用是在运行时保证您的移动应用程序未被篡改或未在获得 root 权限的设备中运行,方法是在后台运行 SDK,该 SDK 将与云中运行的服务进行通信以证明您的移动应用程序的安全性。移动应用程序和设备运行的完整性。

成功证明移动应用程序完整性后,会发出一个短暂的 JWT 令牌,并使用只有 API 服务器和云中的移动应用程序证明服务知道的秘密进行签名。如果移动应用程序认证失败,JWT 令牌将使用 API 服务器不知道的秘密进行签名。

现在,应用程序必须在每次 API 调用时发送请求标头中的 JWT 令牌。这将允许 API 服务器仅在可以验证 JWT 令牌中的签名和过期时间时才服务请求,并在验证失败时拒绝请求。

一旦移动应用程序不知道移动应用程序证明服务使用的秘密,就不可能在运行时对其进行逆向工程,即使应用程序被篡改、在 root 设备中运行或通过正在使用的连接进行通信也是如此。中间人攻击的目标。

移动应用程序认证服务已作为 SAAS 解决方案存在,位于Approov https://www.approov.io/approov-in-detail.html(我在这里工作)为多个平台提供 SDK,包括 iOS、Android、React Native 等。集成还需要对 API 服务器代码进行少量检查,以验证云服务颁发的 JWT 令牌。此检查对于 API 服务器能够决定服务哪些请求以及拒绝哪些请求是必要的。

结论

最后,必须根据您要保护的内容的价值以及该类型数据的法律要求(例如欧洲的 GDPR 法规)来选择用于保护 API 服务器的解决方案。

因此,使用 API 密钥可能听起来像是锁上家门并将钥匙留在垫子下,但不使用它们就像将车停在门关闭的情况下,但将钥匙放在点火装置中。

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

移动后端API密钥的安全性 的相关文章

  • 64 位上的 ASLR 和内存布局:是否仅限于规范部分 (128 TiB)?

    当加载启用 ASLR 的 PIE 可执行文件时 Linux 是否会限制程序段到规范部分 最多 0000 7fff ffff ffff 的映射 还是会使用完整的较低部分 起始位 0 显然 Linux 不会给你的进程提供不可用的地址 这会导致它
  • Windows 10:如何防止切换或关闭应用程序

    我正在为 Windows 10 设备开发一个应用程序 该设备将在公共场所暴露给用户 并且其硬件按钮将无法访问 如何防止用户使用触摸屏手势关闭我的应用程序 使用分配的访问权限设置您的应用程序 http www winbeta org news
  • 我首次设置 AWS EB 时创建的默认安全组是什么?

    我对几个组所扮演的角色感到困惑 这些组似乎已自动添加到我的 AWS 安全组列表中 并以我收集的默认配置进行连接 并且想知道它们是如何工作的 以及它们的安全性如何 改变 具体来说 有三个神秘之处 launch wizard 1其中有一条入站规
  • 身份验证中的随机数使用

    在基于摘要的身份验证中 随机数由服务器生成 然而 在基于 OAuth 的身份验证中 随机数是由客户端生成的 我想知道是否有人知道差异的原因 随机数用于使请求唯一 在没有随机数的身份验证方案中 恶意客户端可以生成一次请求并重放多次 即使计算成
  • Firebase API 密钥限制不适用于 Android 应用程序包名称和 SHA1 指纹

    我们正在使用 Google Firebase 获取我们应用程序的 CrashLytics 数据 以及通过google services json文件被提出作为一个安全问题 因为应用程序 apk 文件可以被逆向工程来获取该文件 然后攻击者可以
  • 当 .NET 项目开源时,谁应该拥有用于签署 .NET 程序集的私钥? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 更具体地说 是一个类库程序集 我最初的想法 让一些指定的管理员进行所有程序集签名 但是 当错误修复和新版本被编写时 二进制文件最终将依赖于它们的
  • CAS(代码访问安全)的目的是什么?

    我参与过很多 Web 应用程序 但从未使用过 CAS 也许也从未觉得有必要使用它 什么时候需要使用CAS 人们真的在他们的应用程序中使用它吗 CAS 实际上只在桌面应用程序中有用 可以这么说 在桌面应用程序中 您想要限制通过网络 例如 运行
  • 如何使用正则表达式删除JS中的ul标签和所有包含的内容

    我如何用js删除ul标签和所有内容 例子 div ul li a li li b li ul div 我要这个 div div i use var replace regex 有人可以帮助我吗 诗 只有js 我不能使用Jquery 如果您坚
  • 在本地安全存储用于 Web 服务的密码

    我有一个应用程序 通过发送用户名和密码来对第三方 Web 服务进行身份验证 目前 我每次启动应用程序时都会在 winform 上输入密码 但我需要它自动登录 我想比更安全地存储用户名 密码 Dim username as String us
  • 如何检测 Facebook 应用内浏览器?

    您有过 Facebook 应用内浏览器检测的经验吗 用户代理的核心区别是什么 我不想知道它是否是唯一的移动 ios chrome 我需要知道用户代理是否特定于Facebook 应用内浏览器 您可以在用户代理中检查 FBAN FBAV 检查此
  • 遭受xss攻击后如何恢复站点?

    最近我正在研究XSS攻击以及它们对网站的破坏性有多大 让我惊讶的是 网络 even SO 充满了关于如何防止xss攻击但没有相关资源说明如何在网站受到 xss 攻击后恢复网站 我遇到过一些事情 比如 将备份网站代码上传回服务器 下载整个网站
  • 如何在 Google Translate Node.js 代码中设置 API KEY

    我正在尝试创建一个使用 Google Translate API 的 Node js 代码 我从以下代码中得到了谷歌文档 https cloud google com translate docs translating text 但是当我
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 过滤条件的查询字符串与资源路径

    背景 我有2个资源 courses and professors A course具有以下属性 ID topic 学期号 年 部分 教授 id A professor具有以下属性 ID 学院 超级用户 名 姓 所以 你可以说一门课程有一位教
  • SSL 和会话劫持/固定

    快问 SSL 是否完全防止会话劫持 固定 谢谢 不可以 例如 在以下情况下可能会发生劫持 被黑客入侵的 CA 根签署无效证书 该证书可用于发起中间人攻击 被黑客攻击的域名所有者电子邮件收件箱使黑客有可能购买经过域名验证的证书 错误的密钥策略
  • 制作适合移动设备的网站的最佳方法是什么?

    完全用与技术无关的术语来说 制作适合移动设备的网站的最佳方法是什么 也就是说 我想创建一个可以在普通计算机上运行但也有移动版本页面的网站 我应该重写每一页吗 这些页面可能会有不同的功能 那么我应该重写后端代码吗 它应该是具有相同数据库的实际
  • 离子旋转器未显示

    我用 http 请求填充 Ionic 集合重复列表 但我不想将所有内容直接加载到 DOM 中 因此 我只显示其中一些项目 并在您向下滚动时添加其余项目 为此我实现了无限滚动功能 当我到达页面底部时 它应该显示一个旋转器 但它没有 这些物品至
  • 保护 REST 和 JSON

    我想利用 RESTful 架构构建提供 JSON 数据的 Web 服务 但我只想要我自己的客户端应用程序可以从我的网络服务请求 基本上 我的 Web 服务包含不供公众使用的敏感数据 但我想以这种方式构建它 以便我可以构建连接到我的 Web
  • 如何使用 PHP 正确添加跨站请求伪造 (CSRF) 令牌

    我正在尝试为我网站上的表单添加一些安全性 其中一个表单使用 AJAX 另一个表单是简单的 联系我们 表单 我正在尝试添加 CSRF 令牌 我遇到的问题是令牌有时只显示在 HTML 值 中 其余时间 该值为空 这是我在 AJAX 表单上使用的
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有

随机推荐

  • QSettings():如何保存到当前工作目录

    对于可以直接从闪存 笔 USB 跳转 拇指驱动器运行的应用程序 为了从一台机器移动到另一台机器的可移植性 将用户设置存储在记忆棒上与应用程序相同的目录中是有意义的 程序正在运行 而不是 Windows Mac Linux 用户或每台机器的系
  • 从共享文件夹上的另一个 Excel 工作簿复制并粘贴到同一文件夹

    请告诉我以下问题 我已经为此工作了 3 个月 但我无法理解它 我必须解释整个项目 以便您能够理解我希望我的代码做什么 我创建了一个用于数据输入的用户表单 它将由 3 个用户同时使用 PC 上的每个用户都有相同的 Excel 工作簿 ENTR
  • 无法从 Nginx 反向代理后面的 docker 容器提供静态资源

    我正在尝试使用 Nginx 作为反向代理来为两个容器提供服务 这是我的 Nginx conf 文件的一部分 upstream dashboard server dashboard 80 upstream editor server edit
  • 警告:file_put_contents(symfony):无法打开流:第 1 行命令行代码中的权限被拒绝

    我正在尝试安装 Symfony 2 php r file put contents symfony file get contents https symfony com installer 但我收到此错误 警告 file put cont
  • 记录无法读取; “MSysObjects”没有读取权限

    我正在尝试使用 Excel VBA 从 Access 2007 ACCDB 格式数据库获取所有表的列表 我已经关注了这个帖子 如何从 MS Access 数据库获取表名 https stackoverflow com questions 2
  • 混淆(minifyEnabled true)在调试和发布中不起作用

    我无法在调试和发布模式下使用 minifyEnabled true 运行 apk 我引用了下面的链接 但没有一个对我有用 1 Android 错误 任务 app transformClassesWithDexForRelease 执行失败
  • 如何使用 NMS 和 C# 识别 ActiveMQ 断开连接

    我有一个 C 发布者和订阅者 它们使用 ActiveMQ 和 NMS 相互通信 一切工作正常 除了我无法知道 ActiveMQ 何时出现故障 这对于消费者来说尤其不利 他们停止获取数据 但除了数据停止显示之外 不会引发任何错误或事件 有没有
  • Zuul - Api 网关身份验证

    我想在几个服务前面通过Spring Cloud引入Zuul作为API网关 我对身份验证有一些设计疑问 身份验证将由 Spring Security 处理 它位于 servlet 过滤器链中的 Zuul 之前 我的顾虑 网关将位于许多服务的前
  • 删除声明同步身份 2.2

    我对 Identity 2 0 有问题 我正在尝试更新用户的声明 这是我的代码 var UserID User Identity GetUserId var claims await UserManager GetClaimsAsync U
  • 在 AFNetworking 2.0 中使用 SSL 时出现错误 1012

    我正在尝试通过 SSL 连接到我的网站 该网站使用 StartSSL 签名的证书 当我浏览网站时 一切正常 但是 当我尝试在应用程序中使用 SSL 时 我得到 Error Domain NSURLErrorDomain Code 1012
  • ReferenceError:浏览器未定义

    我正在运行这段代码 而 Firefox 给出了错误 未捕获的引用错误 浏览器未定义 const manifest browser runtime getManifest 到目前为止我已经尝试使用这个 var 浏览器 浏览器 铬合金 仍然如此
  • 如何在 CSSStyleDeclaration 对象上设置 hsl 颜色?

    如何设置hsl颜色CSSStyleDeclaration object CSS background color hsl 155 100 30 JavaScript divElement style backgroundColor 我不想在
  • 通过远程桌面开发[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人对通过远程桌面进行团队工作有任何成功的评论吗 在许多工作场所 我们通过 Citrix 将最终用户和应用程序放置在功能强大的中央服务器上 有时
  • Scala 特征如何编译成 Java 字节码?

    我已经使用 Scala 一段时间了 我知道特征可以充当 Scala 中接口和抽象类的等价物 Trait 究竟是如何编译成 Java 字节码的 我发现了一些简短的解释 说明特征在可能的情况下与 Java 接口完全一样地编译 否则与附加类的接口
  • 哪里可以下载 AdventureWorks 2008.msi?

    我想安装冒险工场 2008 我刚刚安装了 SQL Server 2008 R2 Express 每次我从 CodePlex 下载推荐版本时 我得到的只是AdventureWorks2008 mdf文件 我不仅无法从 SQL Server M
  • C++ 后缀/前缀运算符重载为非成员函数

    我正在编写自己的数组类作为练习 因为 我读到非成员函数实际上在某些方面比成员函数更好 斯科特 迈耶斯 http www drdobbs com cpp how non member functions improve encapsu 184
  • jquery改变属性

    我有 4 个链接 我需要更改 rel 属性中的 href 属性 我知道我不能这样做 所以我尝试从 href 属性获取数据 设置一个新属性 rel 在其中插入数据 然后删除 href 属性 基本上我正在这样做 div menu ul li a
  • 如何在 WordPress 中使用 wp_get_nav_menu_items 生成自定义菜单/子菜单系统?

    我有一个 html 结构 需要自定义wp nav menu code 这是我需要生成的html ul class main nav li class item a href http example com p 123 class titl
  • 仅将两个目录交集的文件从目录 1 复制到目录 2

    假设我有 dir 1 file a subdir 0 file b file c dir 2 file a subdir 0 file b 我想将两个目录中存在的每个文件复制到 dir 2 在上面的例子中 这意味着file a and su
  • 移动后端API密钥的安全性

    假设我正在开发一个调用 API 服务器的移动应用程序 API 服务器由 API 密钥保护 我无法在移动应用程序中对 API 密钥进行硬编码 因为它可能会被盗 如何保护 API 密钥 假设我正在开发一个调用 API 服务器的移动应用程序 AP