【问题标题】:How to perform obfuscation of source code and protect source in electron js如何在电子js中对源代码进行混淆并保护源代码
【发布时间】:2020-01-25 22:57:33
【问题描述】:

我最近开发了一个带有 electron 框架的应用程序,在阅读了与电子 JavaScript 代码相关的安全问题后,我现在担心源代码保护。

我的意思是即使应用程序是为生产而构建的,也可以对代码进行逆向工程。我的应用程序包含许多重要信息,例如用于自动更新的 GitHub Private Token 等等。

我刚刚浏览了许多 SO 帖子,但没有找到完美的答案,因此请解决问题。使用电子无法混淆javascript代码或源代码保护?然而,混淆并不能完全保护代码,但它会使逆向工程变得复杂。如果有解决方法,请告诉我。我在电子的安全相关帖子中没有找到超过tl;dr

我通过obfuscator 找到了一种混淆方法,但似乎需要手动混淆,并且与NW.js 中的源代码保护无关。有没有更好的方法来实现它?

我在Medium post 上发现了一些有助于混淆的内容。但没有找到任何关于源代码保护的信息。

【问题讨论】:

  • 第一个问题应该是:“如果它对安全性至关重要 - 为什么需要客户端的那些”?如果某些事情真的很重要,那么混淆就是错误的路径-而是以无需这些凭据即可工作的方式更改您的应用程序-例如将这些数据外部化到 Internet 上的服务器。
  • 似乎不可能,考虑客户端JWT token签名验证的情况,我必须存储JWT秘密客户端。在另一种情况下,考虑我使用Github 提供程序为AutoUpdate 并且我必须有一个GitHub Private repo 令牌客户端。我知道混淆并不能完全解决问题,但它可能有助于使找出这些细节变得复杂。
  • 您的应用似乎有问题。据我所知,JWT 令牌是在身份验证服务器上创建的,而不是由客户端应用程序创建的。因此,客户端应用不需要“签名”新的 JWT 令牌,因此不需要 JWT 签名密钥。
  • 好的,同意你关于JWT Token的另一个令牌呢?
  • 即使您设法混淆了代码,也有像lelinhtinh.github.io/de4js 这样的工具可以自动撤消大部分混淆。您应该假设存储在应用程序中的任何数据都可以并且将会被有足够积极性的用户读取。

标签: javascript security electron obfuscation code-security


【解决方案1】:

有一个名为 bytenode 的库,它允许您将 Javascript 文件转换为二进制文件,这样任何人都无法读取它。

https://www.npmjs.com/package/bytenode

首先在您的服务器和文件夹中安装 bytenode:

>npm i -g bytenode
>npm i bytenode

创建一个普通的 nodeJS 文件,其中包含以下代码。假设我们将以下代码命名为:ok.js

console.log('bytenode works');

然后,编译您的 JavaScript 代码。该命令将创建一个与您的文件同名的 .JSC 文件。

user@machine:~$ bytenode -c ok.js

然后,在一个主 JS 文件中,您将调用您的二进制文件,我们称之为 test.js:

const bytenode = require('bytenode'); 
const myFile=require('./ok.jsc'); 
myFile;

保存它。

然后,您将调用 test.js: node test.js 对其进行测试。做一个“cat ok.jsc”看看它真的是一个二进制文件,没有人看不到你的代码。您可以将原始纯测试 js 文件移动到另一个位置。

【讨论】:

【解决方案2】:

tl;dr 你可以,但不值得努力。只需打包您的来源 到asar 文件中,它使大多数人远离它。

长篷:

  • 在构建应用时使用asar 选项。
  • 用丑陋的方法混淆代码。
  • 使用 WASM
  • 语言绑定从编译格式中获取数据
    • Rust 的 neonjs
    • 用于 C# 的 edge-js
    • N-API,用于 C/C++ 的 NAN

否则您的文件是脚本,所有这些步骤只会减慢 攻击者(许多防御的策略),但他们不会阻止他们 从访问它们。 devTools 相当容易打开和 人们将能够以某种方式、形状或形式阅读代码。和 如果有人得到了你的混淆代码,那么重建什么很简单 正在发生(请参阅此处以供参考: https://www.youtube.com/watch?v=y6Uzinz3DRU)

如果你想保护自己免受代码操纵,有 更好的方法来做到这一点。像散列,上下文隔离等电子 关于这个问题有一整章。

https://github.com/electron/electron/blob/master/docs/tutorial/security.md

【讨论】:

  • stackoverflow.com/questions/50033184/… 的直接回答,但仍然有意义。
  • 哦,在那种情况下,我相信这篇文章在技术上违反了 stackoverflow 帖子(CC BY-SA 3.0)的许可,因为它没有注明来源。
【解决方案3】:

Nicolas Guérinet 的回答中提到了你可以使用 bytenode。

但是,当您尝试在电子项目中使用 bytenode CLI 生成的二进制文件时,会出现运行时错误。错误会说如下:

"Invalid or incompatible cached data (cachedDataRejected)"

要使二进制与电子一起工作,它必须由电子本身生成。

下面是如何让它工作:

假设你想在一个典型的电子项目中保护 main.js。

安装字节节点

npm i bytenode

将 main.js 重命名为其他名称,例如 temp.js。

使用以下代码创建一个新的 main.js:

const { app, BrowserWindow } = require('electron')

function createWindow() {
    // Create the browser window.
    mainWindow = new BrowserWindow({
        width: 400,
        height: 200
    })

    //use bytenode to convert js files to jsc
    const bytenode = require("bytenode");
    let compiledFilename = bytenode.compileFile({
        filename: './temp.js',
        output: './main.jsc'
    });
    //convert other Node.js files as required
}

app.whenReady().then(() => {
    createWindow()
})

现在运行您的电子项目。当空白窗口出现时,查看你的项目目录,你会发现 main.jsc 文件。

将你的 main.js 更改为以下三行代码:

const bytenode = require('bytenode'); 
const myFile = require('./main.jsc'); 
myFile;

从您的项目中删除您的 nodejs 源文件 (temp.js) 并构建您的项目。

您还可以在将代码转换为 jsc 之前对其进行压缩和混淆。

感谢https://github.com/mapleby 他在https://github.com/bytenode/bytenode/issues/63 的帖子。 我已经调整了他的想法以使其发挥作用。

这将使某人对您的代码进行逆向工程变得更加困难,但它仍然是可能的。

【讨论】:

    【解决方案4】:

    如果您指的是出于某种原因必须在客户端拥有的代码,那么混淆肯定会有所帮助。没有什么是无法战胜的混淆。但是,它可能会将去混淆的成本提高到对攻击者来说不值得的程度。

    OWASP Mobile Top 10 2016-M9-Reverse Engineering 提到这一点:“为了防止有效的逆向工程,你必须使用混淆工具”。然后您还可以从运行时自我保护中受益,您也可以在OWASP list 上找到它:“移动应用程序必须能够在运行时检测到代码已经添加或更改,而不是它在编译时对其完整性的了解. 应用程序必须能够在运行时对违反代码完整性的行为做出适当的反应”。

    在比较不同的混淆器时,检查它们是否提供支持和文档并确保其背后的公司不会添加恶意软件并将其隐藏在混淆代码中至关重要。这就是免费混淆器经常不足的地方。

    查看Jscrambler 获取企业解决方案。他们支持 Electron,他们的混淆转换的完整列表是可用的here

    【讨论】:

    • 感谢您提供有用的答案,但是,我不是在寻找企业解决方案。我正在寻找开源或与电子 ti self 集成。您也可以推荐免费软件。
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2015-07-21
    • 2012-08-14
    • 2013-03-24
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多