提问人:Hossein Fallah 提问时间:11/3/2021 更新时间:11/4/2021 访问量:1078
如何管理需要客户端代码密钥的 npm 包的 API 密钥?
How to manage API keys for npm packages that require key on the client-side code?
问:
关于如何安全地处理 API 密钥,这是一场激烈的辩论。
我们几乎所有人都知道,将它们存储在服务器端,并且永远不会在客户端应用程序中公开是最好的解决方案。
我们的客户可以向我们的 API 发送请求,我们的 API 可以充当代理,向第三方 API 发送/接收数据,并将响应返回给我们的客户。
但是,您可以将一些第三方 SDK 集成到客户端应用中,并且它们也有自己的 API 密钥。
例如,Zoom 有适用于 Web、Android、iOS、Windows 等的 SDK,或者 Pusher 有 Pusher Key。
当您想使用这些库时,您不能向您的 API 发送请求以隐藏 API 密钥。您必须在客户端代码(例如 react)中初始化这些库。
Zoom 中用于在 Web 应用程序中加入会议的示例:
client.join({
apiKey: apiKey,
signature: signature,
meetingNumber: meetingNumber,
password: password,
userName: userName
})
保护客户端 SDK 和库的 API 密钥的最佳做法是什么?
答:
您到底想保护什么?我假设你想避免有人滥用你的 API 密钥,但你应该问问自己,你想保护什么安全风险或威胁?
您还应该了解您正在处理哪种类型的 API 密钥,因为并非所有 API 密钥都适用于相同的用例,并且可以“提供”不同级别的安全。
例如,你可以有一个 API 密钥,格式为 (例如,在 GitHub 中),其中令牌直接绑定到用户/员工,应被视为机密,或者你可能有一个机器令牌形式的 API 密钥,它与你的组织或存储库绑定(仍在 GitHub 中, 例如),并且可以配置不同的权限(只读、读写)。personal access token
也可以根据客户端本身的可能性,对某些客户端进行配置和限制 API 密钥。 例如,某些 Google Maps API 允许您配置一个受信任的来源,允许它使用您的特定 API 密钥执行请求,但这种保护是通过检查请求的反向链接标头来工作的,并且它可能会被任意客户端欺骗。浏览器仍应遵守约定并发送正确的引荐来源网址,以保护您免受想要在其网站上使用您的 API 密钥的人的侵害。
移动应用程序领域的另一个例子:有一些供应商允许您将 API 密钥绑定到特定的包名称,然后由供应商的 SDK 在运行时对其进行验证,但这种保护通常是一种许可机制,以避免开发人员免费配置带有泄露 API 密钥的 SDK。
大多数情况下,如果 API 密钥打算在公共客户端上使用,那么 API 的开发人员已经考虑过泄露的威胁,您不应该受到影响。这意味着您将免于巨额的 API 使用费用或速率限制/使用配额限制(但最好检查一下自己!
一般规则是始终检查您尝试配置的应用程序的开发人员文档,并了解如何为您的用例创建适当的 API 密钥,以及您是否可以从客户端“泄露”它。此外,如果 API 密钥允许您配置权限,请记住遵循最小权限原则。
另一个黄金法则是始终威胁你的实现模型:
- API 密钥有哪些功能?
- 如果攻击者访问 API 密钥,他们能做的最糟糕的事情是什么?
- 我是否在保护自己免受这些威胁?如何?我可以在后端放置更多控件或监视器(即高使用率通知等)吗?
最后,如果您的 API 密钥需要保密,那么无论它多么隐蔽,您都不能在公共客户端上使用它。总会有至少一个人能够检索它(也不要依赖客户端检查!在这种情况下,您可能希望拥有自己的后端服务,既负责使用秘密 API 密钥查询 API,又负责对客户/用户进行身份验证和授权,并实施其他安全措施,例如速率限制。
我发现非常有帮助的一件事是始终记录任何生成/使用的 API 密钥及其功能,以及泄露它们的威胁以及一些预防措施以最大限度地降低风险。
您的问题
当您想使用这些库时,您不能向您的 API 发送请求以隐藏 API 密钥。您必须在客户端代码(例如 react)中初始化这些库。
保护客户端 SDK 和库的 API 密钥的最佳做法是什么?
好吧,你发现自己是一个很难解决的问题(但在某种程度上并非不可能),因为一旦 API 密钥在客户端,它就是公开的。因此,无论您隐藏得多么好,始终可以在浏览器或移动应用程序上检索它。
Web 应用
在浏览器上,获取 API 密钥非常简单,只需打开开发人员工具,然后在网络选项卡中查找您有兴趣提取 API 密钥的请求,然后单击它以检查请求标头。
移动应用
在移动设备中,从移动应用程序中提取 API 密钥更费力,但许多人可能认为这并不难。
JNI/NDK - 在本机 C 代码中隐藏 API 密钥
例如,您可以通过 JNI/NDK 在 C 本机代码中隐藏 API 密钥:
借助 Android Studio 2.2 及更高版本,您可以使用 NDK 将 C 和 C++ 代码编译到原生库中,然后使用 IDE 的集成构建系统 Gradle 将其打包到 APK 中。然后,Java 代码可以通过 Java 本机接口 (JNI) 框架调用本机库中的函数。
此方法旨在通过静态二进制分析保护 AP/i 密钥不被从移动应用二进制文件中提取,如我写的这篇 repo 和博客文章所示:
在本文中,我们将使用 Android Hide Secrets 研究存储库,这是一个虚拟移动应用程序,使用几种不同的技术隐藏了 API 密钥。
使用 MitM 攻击提取隐藏在本机 C 代码中的 API 密钥
在上面的博客文章中,隐藏在带有 JNI/NDK 接口的源代码中的 API 密钥无法通过静态二进制分析提取,但正如我在文章中演示的那样,使用 MitM 攻击很容易提取 Api 密钥与中间人攻击:
为了帮助演示如何窃取 API 密钥,我在 Github 中构建并发布了适用于 Android 的货币转换器演示应用程序,它使用我们在早期的 Android Hide Secrets 应用程序中使用的相同 JNI/NDK 技术来隐藏 API 密钥。
因此,在本文中,您将学习如何设置和运行 MitM 攻击以拦截您控制的移动设备中的 https 流量,以便您可以窃取 API 密钥。最后,您将大致了解如何缓解 MitM 攻击。
使用证书固定防止 MitM 攻击
防止 MitM 攻击的第一件事是使用证书固定,我在文章中写了关于如何做到这一点的文章 使用证书固定保护 HTTPS:
为了演示如何使用证书固定来保护移动应用和 API 服务器之间的 https 流量,我们将使用我在上一篇文章中使用的相同的货币转换器演示移动应用。
在本文中,我们将了解什么是证书固定,何时使用它,如何在Android应用程序中实现它,以及它如何防止MitM攻击。
我现在看到你脸上的笑容,但不会持续太久,因为可以绕过证书固定。
绕过证书固定
可以重新打包移动应用而不固定,也可以在运行时使用检测框架来禁用它。
重新打包移动应用以绕过固定
当您拥有正确的工具并且开源充满了它们时,这并不难实现。我在文章中写了如何做到这一点 绕过证书固定
在本文中,您将学习如何重新打包移动应用程序,以使其信任自定义 ssl 证书。这将允许我们绕过证书固定。
使用检测框架绕过固定
这是我的首选方法,我偏爱的仪器框架是 Frida,你猜怎么着,我还有一篇关于它的文章,标题为 如何在 Android 应用程序上使用 Frida 绕过证书固定,向您展示如何做到这一点:
今天,我将展示如何使用Frida检测框架在运行时挂接到移动应用程序并检测代码,以便即使移动应用程序已实现证书固定,也可以执行成功的MitM攻击。
绕过证书固定并不太难,只是有点费力,并且允许攻击者详细了解移动应用程序如何与其 API 通信,然后使用相同的知识来自动攻击或围绕它构建其他服务。
可能的解决方案
您可以采用一系列不同的方法和技术来保护您的 API 服务器和移动应用程序,但最好使用跨移动/Web 应用程序和 API 服务器的安全解决方案。
要使用的解决方案将取决于您的威胁模型、预算和资源,我将在下面为您提供一些选项的指针。
对于移动应用程序
我建议您阅读我对如何保护移动应用程序的 API REST 问题的答案,尤其是强化和屏蔽移动应用程序、保护 API 服务器和可能的更好解决方案部分。
对于 Web 应用
您可以学习一些有用的技术来帮助您的 API 后端尝试仅响应来自您期望的请求,即您的真正的 Web 应用程序,为此,我邀请您阅读我对问题的回答 保护来自应用程序调用的 api 数据,尤其是专门用于保护 API 服务器的部分。
你想加倍努力吗?
在对安全问题的任何回答中,我总是喜欢引用OWASP基金会的出色工作。
对于 API
OWASP API 安全项目旨在通过强调不安全 API 中的潜在风险并说明如何减轻这些风险,为软件开发人员和安全评估人员提供价值。为了实现这一目标,OWASP API 安全项目将创建并维护 10 大 API 安全风险文档,以及创建或评估 API 时最佳实践的文档门户。
对于移动应用程序
OWASP移动安全项目是一个集中式资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类,并提供开发控制,以减少其影响或被利用的可能性。
移动安全测试指南 (MSTG) 是一本关于移动应用安全开发、测试和逆向工程的综合手册。
对于 Web 应用
OWASP Web 安全测试指南包括一个“最佳实践”渗透测试框架,用户可以在自己的组织中实施该框架和一个“低级”渗透测试指南,该指南描述了测试最常见的 Web 应用程序和 Web 服务安全问题的技术。
评论
apiKey
apiKey