Electron: 使用 Electron 构建应用程序真的可以保护源代码吗?

创建于 2015-08-24  ·  66评论  ·  资料来源: electron/electron

大家好,

这不完全是一个错误。

我想知道; 使用 Electron 构建的应用程序是否可以保护源代码? 我尝试了 JxCore,但它不保护源代码。 电子呢?

干杯

最有用的评论

对这个真的很感兴趣,我也把@craftpip告诉我们的文章红了,似乎还挺有趣的。 如果电子有代码保护(即使它在用户端较慢),这将使许多开发人员在编写应用程序时感到安全和自信。 给它一个机会电子团队;)

所有66条评论

不,即使您将源代码打包在asar存档中,也很容易获得源代码,V8 JavaScript 引擎从未设计为隐藏源代码。 NW.js 确实成功地完全隐藏了源代码的一个文件,但代价是性能显着下降。

所以如果你真的想保护你的源代码,你必须用 C++ 编写它们并制作一个原生的 Node 模块。

有一些选择,但它们提供的保护级别受到@zcbenz提到的原因的

  • 您可以在 C++ 节点插件中自己实现一些解密逻辑,但它可能仍然是可破解的(例如,调试程序并在解密后但在 eval 之前复制源代码)。
  • 还有EncloseJS ,它声称可以为 node.js/io.js 编译您的代码,因此它可能适用于 Electron。
  • nw.js是一个类似的项目,它支持提供某种保护的 v8 快照(请参阅此处的详细信息)。

请注意,所有这些方法都会导致一些性能损失。

@etiktin我也
是否可以直接在 C++ 插件中应用 node.js 代码?

@fritx ,Node 有一个名为 vm 的模块,可以评估代码。 我想你可以找到一种方法来调用它,或者它从你的插件中强调 C++ API 并使用它来加载你的代码。
请记住,用户仍然可以设法打开开发人员工具并查看加载的脚本。 即使您设法使用自定义 Electron 构建和插件检查来阻止它,以查看您的 Electron 构建没有被篡改,用户仍然可以将您的代码视为内存中的字符串。

听起来不错,保护源头! :钥匙:

然后我有一个问题,GitKraken、Whatsapp 或 Slack 等封闭式代码电子应用程序如何隐藏代码?

@ alexis57我有同样的问题; 也许只是检查元素被禁用或什么的

或者也许主要代码来自 C/C++ 库,然后他们只为 GUI 使用电子,不知道......

也想知道 whatsapp 和 slack 如何保护他们的源代码

AFAIK 它只是不受保护的。 您可以提取他们的 app.asar 并访问源代码。 对于应用程序的敏感部分,您通常使用编译语言(如 C/C++)编写自定义插件,如上所述。

我们如何在其中编译 C++ 代码?

请参阅: https :

@boeserwolf谢谢! :)

已订阅

也可以使用node-ffi 。 Electron 应该只用于 UI。

可能值得探索用 C/C++ 编写代码,然后使用像emscripten这样的工具将其转换为 Web 程序集。 这应该适用于 Chromium

任何东西都可以通过足够的努力来分解/去混淆。 用 JavaScript 编写代码并将其包含在 ASAR 中将使大多数人望而却步。 是否有理由保护版权/许可未涵盖的代码?

我的 2 美分在这里,NW 似乎解决了 v8 快照的问题
https://nwjs.io/blog/js-src-protect-perf/

我从nwjs看到这篇文章,“编译后的二进制代码现在运行速度和JS源代码一样快,没有性能开销”,之前是30%,在以后的NW版本中会默认开启。

对这个真的很感兴趣,我也把@craftpip告诉我们的文章红了,似乎还挺有趣的。 如果电子有代码保护(即使它在用户端较慢),这将使许多开发人员在编写应用程序时感到安全和自信。 给它一个机会电子团队;)

对开发者来说太不舒服了。 放弃,转战西北...

我想分享其他以非常优雅的方式使用代码保护的 node.js 项目: https :

或许 Electron 有源头保护的希望?

除了对某些部分使用 C++ 之外,您还可以缩小和 _obfuscate_ 您的 JavaScript 源代码(例如使用javascript-obfuscator )。

缩小和混淆将_戏剧性地_增加“窃取”代码所需的工作量(从而_成本_),通常到了从头开始对整个应用程序进行逆向工程变得更加可行的地步——从技术上讲,你无能为力做逆向工程,即使你完全是本地人(除了寻求法律之外什么都不做)。

如果您不担心隐藏您的源代码,但您确实想隐藏您的秘密,例如:

  • OAuth 凭据
  • 不打算为公众所知的 URL(即私有后端 API 端点)
  • REST API 凭据
  • 任何密钥和秘密
  • 密码

我创建了一个免费服务来解决这个问题。 我不得不这样做,因为我正在制作一个商业电子应用程序,并且担心我的凭据被盗。

它的工作原理是创建一个跨平台的辅助应用程序,该应用程序在您的应用程序未被篡改的情况下启动您的实际电子应用程序。 启动应用程序后,它将通过环境变量传递您的凭据。

更多信息:

介绍:
https://medium.com/@rocketlaunchr.cloud/introducing -electron-vault-d09ade2c2020

文档:
https://rocketlaunchr.github.io/electron-vault-docs/

@JohnWeisz

If the data is indeed sensitive, I think it should be handled by a remote server.

远程服务器服务器如何真正知道客户端实际上是您未更改的电子应用程序?
这就是我试图解决的问题。

如果您将 OAuth 与Client Credentials授权类型一起使用,那么您的client_secret仍会嵌入到您的应用程序中,理论上任何人都可以读取它。 随着 Electron 源代码 100% 开放和可用,很容易搜索看起来“有趣”的字符串。

没有 100% 万无一失的方法来解决这个问题,但我相信我的解决方案是一个明确的改进。

我相信这可以通过使用 webpack 或 SPA 框架(如 angular2/4/6 或 vuejs2)构建您的 JS 应用程序来实现。 这会缩小您的代码及其艰苦的工作,即使提取了 asar 文件,他们也可能难以阅读您的代码

我认为这个问题不应该只关注实际的加密。 但事实上,没有其他应用程序/用户篡改客户端的源代码。

通过存档已签名的 asar 或从中加载源代码的类似二进制文件,电子可以检查文件的完整性。 由于完整性检查可以集成到电子二进制文件本身中,因此 javascript 代码中不会出现过载。 基本上在构建时,电子可能会得到一个标志 --include-integrity-check,否则编译它的正常方式。

@tulpn

由于完整性检查可以集成到电子二进制文件本身中,因此不会有......

- 那么它已经只是提取电子所做的任何完整性检查或加密/解密的问题,并且您拥有源代码。 我确信混淆是您在这里可以采用的唯一方法(无论是缩小、缩小+混淆还是本机代码编译)。

那,或者将您的一些应用程序代码移动到远程服务(如果需要安全性,请使用身份验证)。

您可以加密您的数据并在运行时对其进行解密,然后将其直接加载到令牌或任何类型的敏感数据等变量中,但是如果您正在谈论加密整个 javascript 文件,那么这将对性能造成影响。 你可以试试 Node C++ Addons

正如 nodejs 所说:

Node.js 插件是动态链接的共享对象,用 C++ 编写,可以使用 require() 函数加载到 Node.js 中,并且就像普通的 Node.js 模块一样使用。 它们主要用于在 Node.js 和 C/C++ 库中运行的 JavaScript 之间提供接口。

基本上它将您的代码编译成二进制,这样您就可以抽象您的代码,性能会更快,并且您可以在某种程度上隐藏您的代码。

不,即使您将源代码打包在asar存档中,也很容易获得源代码,V8 JavaScript 引擎从未设计为隐藏源代码。 NW.js 确实成功地完全隐藏了源代码的一个文件,但代价是性能显着下降。

所以如果你真的想保护你的源代码,你必须用 C++ 编写它们并制作一个原生的 Node 模块。

我如何从 c++ 插件中禁用 devtools 以及如何从 c++ 插件访问所有电子 API,是否有任何计划在没有 devtool 的情况下打包应用程序,这可能有助于防止黑客攻击并减少应用程序的大小( @ zcbenz )

我们都厌倦了我们的源代码被发布。 我搬到西北

@ahmtcn123你的评论如何帮助解决这个问题?

您想使用本质上公开其源代码的网络技术构建应用程序,因此请停止这种态度。

  • 你可以为 Electron 做出贡献来解决这个问题
  • 编写 C++ 模块
  • 缩小/混淆/破坏你的代码(不要忘记禁用源映射)
  • 你可以转向另一个类似的技术(比如 nw.js),或者你可以使用原生技术
  • 这里分享了其他一些解决方案,你可以用混淆来换取性能(当我们已经知道 Electron 的性能/资源消耗时,这不是一个明显的选择)

干杯!

_edit: 继续投反对票的家伙_ 🍿

为什么不支持v8snapshot?

我理解我们不能完全保护源代码。 但另一种方法是使用本机编译技术(如 golang)创建 Web 服务,以保护逻辑代码并通过本地主机从电子 UI 调用。

最后一个字

西北

为什么这个问题被关闭了?

因为hidding源代码一直是他们一个有争议的话题,因为它被认为是通过隐藏的安全性来保护你的代码非常糟糕的方法。

如果您需要某种保护,请使用更标准的方法,例如执行关键操作的身份验证、加密等。

真诚的,您可以在 C 上编写您的应用程序并分发二进制文件,无论如何我们都会获取您的源代码。

PD:你可以访问大佬的源代码(whatsapp web、slack、teams、vscode),他们都不关心,也许你做错了什么。

"""PD:你可以访问大佬的源代码(whatsapp web、slack、teams、vscode),他们都不关心,也许你做错了什么。"""

人们很难提出更愚蠢的论点。

销售软件而不希望它被逆向工程并以它不应该的方式使用并不是不正常的,事实上有专门的法律,这并不能阻止用户继续这样做。

@kidandcat

真诚的,您可以在 C 上编写您的应用程序并分发二进制文件,无论如何我们都会获取您的源代码。

继续,获取所有最畅销应用程序(如 Microsoft Word、Photoshop 甚至最畅销游戏)的来源。 你是亿万富翁而我不知道还是什么?

不,大声笑,我不是亿万富翁,因为拥有这些程序的源代码毫无用处,你打算用它做什么?

伙计们,这个帖子中有很多人会收到每条评论的通知,请保持建设性。

可能总结一下为什么在我看来,在许多情况下,必须处理 JavaScript 的源代码特性并不是一个交易破坏者:

  • 这里列出的许多示例应用程序/服务主要是由它们的 _traction_ 驱动的; 以 Twitter 为例,它的内部运作方式并不完全是个谜,但即使完全复制它并完整地复制它,如果没有流量、广告、品牌、支持基础设施,也不会让你走到任何地方,等等。
  • 适当的混淆使得以任何有意义的方式访问源代码变得极其困难,以至于简单地观察应用程序本身的行为并基于此对其进行逆向工程变得更加可行,而不依赖于原始代码源代码——很像 C++
  • 从受版权法保护的应用程序中窃取想法和/或解决方案是一个法律问题,而不是技术问题,因此,无论实施的保护级别如何,保护实施都是一项法律事务; 一个可疑的中国公司会毫无问题地窃取您的徽标和应用程序,无论它是用 JavaScript 还是汇编编写的
  • 此外,如果您不相信混淆,您可以在您的应用程序中包含 C++ 代码,或者您可以将代码移动到远程服务,该服务与其他所有服务(包括 C++)不同,完全可以防止直接检查(而不是逆向工程)尽管)

@JohnWeisz说了很多非常明智的话。 我还要补充一点,如果这对你来说还不够,你今天可以使用 WebAssembly。 在保护源代码方面,这应该是相当不错的。

https://developer.mozilla.org/en-US/docs/WebAssembly

@kidandcat是真的吗?“真诚的,你可以在 C 上编写你的应用程序并分发二进制文件,无论如何我们都会得到你的源代码。”

我在谷歌上搜索,似乎不可能从 C/C++ 编译的二进制文件中获取源代码。 我们最多可以得到汇编语句。

我正在开发一个商业 Windows 桌面软件。 代码逻辑是关键能力。 这些逻辑必须在客户端运行,但我不希望我的竞争对手得到它。 因此,在我的情况下,代码保护是交易破坏者。

@z1988hf

似乎不可能从 C/C++ 编译的二进制文件中获取源代码。 我们最多可以得到汇编语句

这真正意味着您几乎可以对原始源代码或等效的东西进行逆向工程,只是它通常非常困难,因此成本很高。 混淆代码也是如此。

@kidandcat是真的吗?“真诚的,你可以在 C 上编写你的应用程序并分发二进制文件,无论如何我们都会得到你的源代码。”

我在谷歌上搜索,似乎不可能从 C/C++ 编译的二进制文件中获取源代码。 我们最多可以得到汇编语句。

我正在开发一个商业 Windows 桌面软件。 代码逻辑是关键能力。 这些逻辑必须在客户端运行,但我不希望我的竞争对手得到它。 因此,在我的情况下,代码保护是交易破坏者。

汇编也是代码伙伴,您的逻辑将在那里。 您需要做更多的事情来保护您的代码,而不仅仅是编译它。 (但正如@JohnWeisz所说,逆向工程软件非常昂贵,因此如果您的竞争对手不想投入数千美元来尝试它,您就不必担心)

对于那些将 Slack 之类的应用程序称为不关心源代码保护的人来说,这并不是所有应用程序的最佳比较。 Slack 是一项在线服务,他们的电子应用程序只是用于显示其 Web 应用程序的外壳。 大多数像 slack 这样的应用程序的秘密武器都存在于网络服务器上。

对于那些将 Slack 之类的应用程序称为不关心源代码保护的人来说,这并不是所有应用程序的最佳比较。 Slack 是一项在线服务,他们的电子应用程序只是用于显示其 Web 应用程序的外壳。 大多数像 slack 这样的应用程序的秘密武器都存在于网络服务器上。

@你的最爱
Spotify 怎么样!!!,我们知道你的意思,但离线应用怎么样??

@annymosse Spotify 的秘诀不是他们的应用程序。 如果有人偷了 Spotify 应用程序的源代码,那也没什么关系。 该应用程序足够好。 人们使用和支付 Spotify 的真正原因是因为它提供的内容和流媒体音乐的便利性。 Spotify 的许多客户可能更喜欢一些 UX 细节,但竞争对手并不真正需要源代码来复制这些细节。 此外,我没有尝试查看 Spotify 的源代码,但我想他们在应用程序的某个地方内置了某种保护。 可能是一些可靠的混淆以及原生 C 插件。 我认为由于 DRM,这将是他们的要求。

@yourfavorite只是看看它们的来源,请记住,有时我们并没有隐藏我们的商业应用程序的来源,我们这样做是为了防止我们的服务远远超过黑客,因为他们获得了一些弱线,无论如何我们只需要这个功能,如果有能力做到这一点,至少有一些方法可以传递asar filespackage.json*.js

我不是反对源代码保护,而是 Slack 和 Spotify 可能不是大多数人使用电子所做的最好的比较。 此外,如果源代码保护对您的产品至关重要,那么现在可能电子不是最合适的。

需要明确的是,我赞成对电子进行某种源代码保护。

我需要源代码保护。 让我在这里提供一个用例:

我正在尝试基于 Google Translate API 构建翻译软件

用户将.srt/.ass 字幕文件拖入软件,软件将使用谷歌翻译API 翻译每一行。

例子

用户下载了 1 个视频和 1 个英文字幕。
现在他们可以用这个软件翻译这个英文字幕了
成中文或任何其他语言。
所以他们可以理解内容。

问题

如果源代码很容易得到。
显然攻击者可以获得我的 API 密钥和秘密。 并滥用它。
我会从谷歌那里得到一大笔账单(500 美元?1000 美元?更多?)

快速更新(2020 年 3 月 29 日)

我正在使用 Vue.js + Webpack 和 Electron.js
所以所有的代码都会被缩小,所以这不再是问题了

@1c7

好吧,也许您应该使用一些外部保护来实现这一点。 我也可以轻松地从 C++ 软件中获取您的 API 密钥,没问题。 所以这不是一个真正的电子特定问题。

@lvkins哦,我明白了。 我不知道 C++ 软件也有这个问题。 我不熟悉这种语言。
感谢您的提示!

基本上每种编程语言都可以逆向工程。 这一直是一个大问题。 确实,任何保护都比没有保护好,但仍然如此; 无论使用哪种编程语言,我们都需要付出额外的努力来保护敏感数据。 在您的情况下,您可能应该使用 C++ 库,在其上添加一些额外的盐并将其链接到您的 node.js,应该可以。

@lvkins你是在回复我吗?
谢谢你的建议。 我会对此进行调查。

我想使用 Electron.js,因为我希望这个翻译软件能够在 Mac 和 Windows 上运行。

似乎 Electron.js + 一些 C++ 可以保护我的 API 密钥和秘密

谢谢@lvkins

@1c7确实😃

从这里开始: https :

如果您担心电子完全缺乏安全性,您也可以尝试 NW.js。

祝你好运!

@1c7为什么不是 Linux?!! 我认为所有平台的代码库都是一样的,对吧??!

@annymosse我只是忘了提及 Linux,没有任何反对 Linux 的东西。

供参考:

  • 我使用的是 Macbook Pro 2017 15 英寸 (Mac)
  • 我的大多数用户使用 Windows (Windows)
  • 我还没有看到我的任何软件用户在 Linux (Linux) 上使用它

我正在考虑转https://github.com/1c7/Translate-Subtitle-File
把这个项目变成一个严肃的项目(收费并有更高的质量(花更多的时间在上面))
所以我现在正在做我的研究

该工具目前主要针对中国市场。 (所有按钮和文字均为中文)
i18n 在地图上,但不会很快

我曾计划创建 i18n 和 Yandex 翻译器 API,但由于同样的问题,我取消了该项目,然后在 Linux 上,大多数新用户对他们认为在 Linux 中不存在或别无选择的程序没有信心因此,如果您创建该项目并且您的用户目标仅翻译他们可以使用任何 Linux disto 或我喜欢的发行版 deepin(中文 Linux 发行版)的媒体,希望您和所有 Linux 用户一切顺利。

您的 API 密钥和秘密永远不应出现在已发布的应用程序中。 而是有
它们在您的 API/后端,abd 使用某种类型的保护它们
身份验证/限制。 然后让您的应用使用您的 API。

Em dom, 20 de out de 2019 10:22, Cheng Zheng [email protected]
escreveu:

@annymosse https://github.com/annymosse我忘了提到 Linux,
不反对 Linux


您收到此消息是因为您订阅了此线程。
直接回复本邮件,在GitHub上查看
https://github.com/electron/electron/issues/2570?email_source=notifications&email_token=ADCOXMFCSHRX3PZTE7GHKDTQPRLQRA5CNFSM4BODX2F2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKEBYDN55ZG4000000000000000000000000000000000000000000554
或取消订阅
https://github.com/notifications/unsubscribe-auth/ADCOXMCKPUOMQPM3JKZP5J3QPRLQRANCNFSM4BODX2FQ
.

@dotbloup

有一个名为 bytenode 的库,它允许您将 Javascript 文件转换为二进制文件,以便没有人可以读取它。

没有人能够阅读原始来源,这是真的(就像混淆甚至缩小一样),但是您仍然无法在代码中存储任何应用程序机密或其他敏感数据,因为它仍然可以被逆向工程和/或提取相同,这只是时间问题。

如果你想阻止人们检查或“窃取”你的源代码的一部分,这是一个很好的工具,可以让它_更难_,在很多情况下,非常困难。 但是,不要将它用于任何类型的真正安全,因为它可以解决,就像 C++ 编译一样。

@JohnWeisz
我很想看到有人破坏了 V8 字节码二进制文件的代码的证据。 我用 nwjs 开发了一个应用程序,并使用 nwjc 将引擎转换为 bin 文件,这与 bytenode 完全相同。 此应用程序是 Sitecozy 断开链接检查器,可在微软商店免费获得。

我提出一个挑战。
如果有人可以破解我的应用程序的 bin 文件的代码并将我的 bin 文件的功能和方法发送给我,我会给你 150 欧元。 不需要重新创建代码来提供相同的效果,不需要向我展示我的变量或我的 JSON 消息,我不傻。

你可以写信给我在 stepsahe AT hotmail DOT com

@dotbloup

我的意思是人们通常会在几周内破坏从 C++ 编译的机器代码中的复制保护系统,并且几十年来,想想盗版游戏。 重点是,如果这条信息存在于机器中,那么用户也可以将其打开。

安全存储应用程序机密的唯一方法是密封系统,例如后端服务。

这里的重点是提取有价值的信息,函数和方法通常不是其中的一部分。

问题

如果源代码很容易得到。 显然攻击者可以获得我的 API 密钥和秘密。 并滥用它。 我会从谷歌那里得到一笔巨额账单。 (500 美元?1000 美元?10000 美元?谁知道呢)

您的应用程序应该将文本发送到您的服务器,然后服务器将其转发给 Google,接收翻译并将其发送回应用程序。

您应该拥有自己的服务器作为客户和 Google 翻译服务之间的中间人,并且只有您的服务器应该拥有您的 API 密钥。

无论如何,共享您的 API 密钥可能违反 Google 的使用条款。

问题

如果源代码很容易得到。 显然攻击者可以获得我的 API 密钥和秘密。 并滥用它。 我会从谷歌那里得到一笔巨额账单。 (500 美元?1000 美元?10000 美元?谁知道呢)

您的应用程序应该将文本发送到您的服务器,然后服务器将其转发给 Google,接收翻译并将其发送回应用程序。

您应该拥有自己的服务器作为客户和 Google 翻译服务之间的中间人,并且只有您的服务器应该拥有您的 API 密钥。

无论如何,共享您的 API 密钥可能违反 Google 的使用条款。

对于商业项目来说还好,提供资源资金来处理服务成本和团队维护,但是我们需要对开源项目这样的工具进行源代码保护,至少可以防止它难以调试并进行一些黑客攻击。

暂时放弃了 Electron,认为这个问题会在几年前解决。 还是没有解决办法? 非常失望。 我希望我有时间投入这样我可以想出我自己的解决方案。 😟

暂时放弃了 Electron,认为这个问题会在几年前解决。 还是没有解决办法? 非常失望。 我希望我有时间投入这样我可以想出我自己的解决方案。 😟

隐藏js代码是不可能的。 即使您将每个功能分离到单个文件并对其进行混淆,只要文件在客户端计算机上,它就可以被逆向工程。 但是您可以使用服务器支持您的应用程序

此页面是否有帮助?
0 / 5 - 0 等级