如何在 Vue CLI 4 和 Electron 项目中保护环境变量中的 API 密钥

Posted

技术标签:

【中文标题】如何在 Vue CLI 4 和 Electron 项目中保护环境变量中的 API 密钥【英文标题】:How to secure API Keys in Environment Variables in a Vue CLI 4 and Electron project 【发布时间】:2021-09-14 11:18:49 【问题描述】:

我正在尝试开发一个桌面应用程序,该应用程序需要进行一些私有 API 调用,并使用一些密钥进行身份验证。

密钥是由我所在组织之外的外部 IT 服务提供商为我创建的 - 他们负责安全,因此存在一些限制:

    他们表示,即使他们已经采取措施保护 API,并且即使发生违规行为也有适当的缓解策略,但他们仍然希望确保我以安全意识处理密钥心态,并采取一切可能的措施,以确保他们保持安全。 我不能只在私有服务器或无服务器平台上创建随机中间件/网关来代表我的应用执行 API 调用,因为这些调用可能包含业务数据。

我做了一些研究,根据我的发现,一般建议是在项目文件夹中设置一个“.env”文件,并在该文件中使用环境变量来存储 API 密钥。

但在阅读Vue CLI documentation 后,我发现了以下内容:

警告

不要在您的应用中存储任何秘密(例如私有 API 密钥)!

环境变量嵌入到构建中,这意味着任何人都可以 通过检查应用的文件来查看它们。

那么,鉴于这些限制,有没有办法将这些密钥安全地存储在 Vue CLI 4 + Electron 桌面应用项目中?

谢谢。

【问题讨论】:

【参考方案1】:

一般来说,特别是如果你有很多环境变量,最好将环境变量存储在一个点 env 文件(.env)中,但是,当你打包你的电子时,这个文件可能会泄露应用程序。因此,在这种情况下,最好从终端/命令行存储环境变量。为此,请遵循本指南 (https://www.electronjs.org/docs/api/environment-variables)。

请记住,任何需要 API 密钥/私人信息的东西都尽量将其保留在后端,即电子进程并将结果发送到 Vue 前端。

这是一个如何实现的示例:

在来自 CMD 的窗口上:

set SOME_SECRET="a cool secret"

在 POSIX 上:

$ export SOME_SECRET="a cool secret"

主要流程:

// Other electron logic
const  ipcMain  = require("electron");

// Listen for an event sent from the client to do something with the secret
ipcMain.on("doSomethingOnTheBackend", (event, data) => 
    API.post("https://example.com/some/api/endpoint", token: process.env.SOME_SECRET, data);
);

客户端:

const  ipcRenderer  = require("electron");

ipcRenderer.send("doSomethingOnTheBackend", username: "test", password: "some password");

另请注意,要在客户端使用 ipcRenderer nodeIntegration 需要启用。

这里有更多资源可以帮助您入门:

https://www.electronjs.org/docs/api/ipc-renderer

https://www.electronjs.org/docs/api/ipc-main

【讨论】:

以上是关于如何在 Vue CLI 4 和 Electron 项目中保护环境变量中的 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

vue+electron开发踩坑记录

在 Vue CLI 3 中运行 build:electron 后,如何将静态 config.json 文件中的值读取到 Vue 文件中的 TypeScript?

带有 Vue 和 vue-cli-plugin-electron-builder 的电子应用程序无法与 Tesseract.js 一起使用

使用Vue 插件 vue-cli-plugin-electron-builder 打包原生模板时报错解决

在vue-cli-plugin-electron-builder下用electron:build打包或生成应用程序

我在使用带有电子的 vue js 进行捆绑时遇到问题