移动后端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密钥的安全性 的相关文章

  • 使用 Spring Security 和 CAS 单点注销

    使用纯 Spring Java 配置 我在让 Spring 和 CAS 执行单点登录时遇到问题 我使用以下配置进行单点登录 我使用一个简单的 JSP 页面对 url 进行表单 POSThttps nginx shane com app lo
  • 保护 Azure 云服务配置中的敏感信息

    我们正在使用云服务配置 https learn microsoft com en us previous versions azure reference jj156212 v 3Dazure 100 存储应用程序设置 但我们想保护一些应用
  • 用于计算机安全的遗传算法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在为大学选择项目 我对遗传算法和计算机安全的结合非常感兴趣 因此我的问题是 是否可以使用GAany计算机安全方面 例如 我正在考虑
  • 如何避免硬编码密钥进行加密(目标 C)?

    在我的 Objective C 代码中 我在代码中硬编码了一个消费者密钥和秘密 以用于 SHA 1 加密 我想知道是否可以避免硬编码以提高安全性 到目前为止我发现了以下内容 发现1 https www owasp org index php
  • Magento CSRF 保护

    我正在 Magento 中查看自定义表单 我看到了这些教程 http fastdivision com 2012 03 29 diy magento create ajax login registration forms for your
  • 有没有办法使用 Paramiko 和 Python 来获取您连接的 SSH 服务器的横幅?

    有没有办法使用 Paramiko 和 Python 来获取您尝试连接的 SSH 服务器的横幅 我正在处理许多机器的超安全服务器设置过程 密码是通过预定义的密钥生成的 该密钥与 SSH 横幅一起打印出来 我可以访问将为我提供密码的实用程序 但
  • 使用 Passport-facebook 的 Facebook OAuth 安全性

    我目前正在使用客户端 React 组件让用户通过我的应用程序中的 OAuth 登录 Facebook 在服务器端 我使用 npm 包护照 Facebook 令牌 https github com drudge passport facebo
  • android中无法绕过的Root检测方法

    我知道在 root 设备上运行拥有敏感信息的应用程序根本不安全 因此 开发人员通常在这种情况下进行 root 检测 如果发现设备已 root 则该应用程序将不会安装 一切都好 开发者在root检测中使用的主要技术是检查superuser a
  • 如何向所有用户授予团队项目访问权限?

    在我们的组织中 我们有一些项目 根据政策 向所有有权访问 TFS 的开发人员 QA 和项目经理开放 在包含超过 150 个团队项目和 500 多个有效用户的团队项目集合中 我们如何轻松地将所有有效 TFS 用户添加到某个特定项目的 读者 组
  • 我的网站被黑了..我该怎么办? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我爸爸今天打电话给我 说访问他网站的人收到了 168 个病毒 试图下载到他们的计算机上 他根本不懂技术 而是用所见即所得的编辑器构建了整个东西 我打开
  • 关于Android自定义权限的几个问题

    我正在学习 Android 编程 我已经了解了自定义权限的概念 根据我的理解 这是自定义权限的工作原理 Base app 可以通过声明自定义权限 即使用
  • 如何设计导出端点的REST API?

    我正在设计 REST API 并遇到设计问题 我有alerts我希望用户能够export为少数文件格式之一 所以我们已经开始执行操作 命令了export 感觉像是 RPC 而不是 REST 此外 我不想采用默认的文件格式 相反 我想要求提供
  • 安卓应用安全

    我想开发一个用户数据非常敏感的应用程序 我是开发新手 所以不确定以下内容 技术对于安全或高效来说是必要的 请留下您的评论 提前致谢 为了额外的安全性 我们可以避开市场 游戏商店 并将应用程序安装在个人设备上 它会让它更安全吗 我必须在设备上
  • 安全灵活的跨域会话

    我有一个问题希望你能帮忙解决 假设我在一家名为 Blammo 的假设公司工作 我们有一个名为 Log 的假设产品 我正在尝试建立一个系统 人们可以登录 logfromblammo com 并订购我们的一些产品 然后当他们准备好购买时 前往
  • 是否可以将密码以纯文本形式存储在 php 变量或 php 常量中?

    根据问题 在 php 页面上存储密码是否安全 例如 password pa w0rd 如果用户看不到它 那就安全了 对吗 编辑 确实有人建议使用hash 但是数据库服务器连接密码会有问题不是吗 简短的回答是否定的 而且要看情况 以纯文本形式
  • JQuery-UI 水平拖动和垂直滚动

    我有一个页面 其中充满了仅在水平方向 在 X 轴上 的可拖动 div 当我使用触摸设备时 由于滚动和拖动之间的冲突 我无法向下滚动页面 这是一个jsfiddle 示例 http jsfiddle net 742cX 10 在触摸设备中进行测
  • 使用 KMS 的 AWS RDS 加密是否会影响性能?

    Amazon states https aws amazon com about aws whats new 2015 01 06 amazon rds encryption with kms mysql postgresql that 加
  • 使用端口 80 (Ubuntu / Linode) 运行 Node.js 的最佳实践 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在设置我的第一个Node js服务器上的cloud Linux node我对以下细节还很陌生Linux admin 顺便说一句 我并没有尝试
  • Spring Security 实体字段级安全

    我有一个 Spring MVC 应用程序 它提供了一个视图 其中显示了来自Customer实体 例如姓名 地址 电话号码等 该应用程序具有各种角色 例如ROLE USER and ROLE ADMIN 用户具有ROLE USER只能看到客户
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用

随机推荐

  • 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