首页 > 解决方案 > 如何管理需要客户端代码密钥的 npm 包的 API 密钥?

问题描述

关于如何安全地处理 API 密钥是一场激烈的争论。

几乎我们所有人都知道,将它们存储在服务器端而不暴露在客户端应用程序中是最好的解决方案。

我们的客户可以向我们的 API 发送请求,我们的 API 可以充当代理向/从第三方 API 发送/接收数据,并将响应返回给我们的客户。

但是,您可以将一些第三方 SDK 集成到您的客户端应用程序中,并且它们也有自己的 API 密钥。

例如,Zoom 有适用于 Web、Android、iOS、Windows 等的 SDK,或者 Pusher 有 Pusher Key。

当您想使用这些库时,您不能向您的 API 发送请求以隐藏 API 密钥。您必须在客户端代码中初始化这些库(例如反应)。

Zoom在您的 Web 应用程序中加入会议的示例:

client.join({
    apiKey: apiKey,
    signature: signature,
    meetingNumber: meetingNumber,
    password: password,
    userName: userName
})

保护客户端 SDK 和库的 API 密钥的最佳实践是什么?

标签: securityclient-sideapi-key

解决方案


你的问题

当您想使用这些库时,您不能向您的 API 发送请求以隐藏 API 密钥。您必须在客户端代码中初始化这些库(例如反应)。

保护客户端 SDK 和库的 API 密钥的最佳实践是什么?

好吧,您发现自己是一个很难解决的问题(但在某种程度上并非不可能),因为一旦 API 密钥在客户端,它就是公开的。因此,无论您隐藏得多么好,始终可以在浏览器或移动应用程序上检索它。

网络应用

在浏览器上获取 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 密钥。

使用中间人攻击提取隐藏在本机 C 代码中的 API 密钥

在上面的博客文章中,隐藏在带有 JNI/NDK 接口的源代码中的 API 密钥无法通过静态二进制分析提取,但使用中间人攻击很容易提取,正如我在文章Steal that Api Key with a中间人攻击

为了帮助演示如何窃取 API 密钥,我在 Github 上构建并发布了适用于 Android 的Currency Converter Demo应用程序,它使用我们在早期Android Hide Secrets应用程序中使用的相同JNI/NDK技术来隐藏 API 密钥.

因此,在本文中,您将学习如何设置和运行中间人攻击,以拦截您控制的移动设备中的 https 流量,从而窃取 API 密钥。最后,您将了解如何缓解中间人攻击。

使用证书固定防止中间人攻击

防止中间人攻击的第一件事是使用证书固定,我在使用证书固定保护 HTTPS的文章中写了如何做到这一点:

为了演示如何使用证书固定来保护您的移动应用程序和 API 服务器之间的 https 流量,我们将使用我在上一篇文章中使用的相同Currency Converter Demo移动应用程序。

在本文中,我们将了解什么是证书固定、何时使用、如何在 Android 应用程序中实现它,以及它如何防止中间人攻击。

我现在看到你脸上的笑容,但不会太久,因为可以绕过证书固定。

绕过证书固定

您可以在不固定的情况下重新打包移动应用程序,或者在运行时使用检测框架来禁用它。

重新打包移动应用程序以绕过固定

当您拥有正确的工具并且开源充满了它们时,这并不难实现。我在绕过证书固定一文中写了如何做到这一点

在本文中,您将学习如何重新打包移动应用程序以使其信任自定义 ssl 证书。这将允许我们绕过证书固定。

使用 Instrumentation Framework 绕过 pinning

这是我的首选方法,我首选的检测框架是 Frida,猜猜看,我还有一篇文章,标题为How to Bypass Certificate Pinning with Frida on an Android App,向您展示如何做到这一点:

今天我将展示如何使用 Frida 检测框架在运行时挂钩到移动应用程序并检测代码以执行成功的中间人攻击,即使移动应用程序已经实现了证书锁定。

绕过证书固定并不难,只是有点费力,并且允许攻击者详细了解移动应用程序如何与其 API 通信,然后使用相同的知识来自动化攻击或围绕它构建其他服务。

可能的解决方案

您可以使用一系列不同的方法和技术来保护您的 API 服务器和移动应用程序,但优先使用跨越移动/Web 应用程序和 API 服务器的安全解决方案。

要使用的解决方案将取决于您的威胁模型、预算和资源,我将在下面为您提供一些选项的提示。

对于移动应用

我建议您阅读我对如何保护移动应用程序的 API REST问题给出的答案?,特别是强化和屏蔽移动应用程序保护 API 服务器可能的更好解决方案等部分。

对于网络应用

您可以学习一些有用的技术来帮助您的 API 后端尝试仅响应来自所期望的、真正的 Web 应用程序的请求,为此,我邀请您阅读对问题的回答Secure api data from calls out应用程序,尤其是专用于保护 API 服务器的部分。

你想加倍努力吗?

在回答安全问题时,我总是喜欢参考 OWASP 基金会的出色工作。

对于 APIS

OWASP API 安全前 10 名

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

对于移动应用

OWASP 移动安全项目 - 十大风险

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

OWASP - 移动安全测试指南

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

对于网络应用

网络安全测试指南

OWASP Web 安全测试指南包括一个“最佳实践”渗透测试框架,用户可以在他们自己的组织中实施它和一个“低级”渗透测试指南,描述了测试最常见的 Web 应用程序和 Web 服务安全问题的技术。


推荐阅读