俗话说的好,安全大于天,保证 electron 应用的安全也是一项重要的事情,本章节将安全分为以下 5 个方面:
源码泄漏
asar
源码保护
应用安全
编码安全
下面将会依次介绍上述内容。
7.1 源码泄漏
目前 electron 在源码安全做的不好,官方只用 asar 做了一下很没用的源码保护,到底有多没用呢?
你只需要下载 asar 工具,然后对 asar 文件进行解压就可以得到里面的源码了,如下图所示:
通过图中操作即可看到语雀应用的源码。上面提到的 asar 是什么呢?
7.2 asar
asar 是一种将多个文件合并成一个文件的类 tar 风格的归档格式。Electron 可以无需解压整个文件,即可从其中读取任意文件内容。
asar 技术原理:
可以直接看 electron 源码,都是 ts 代码,容易阅读,源码如下图所示:
从图中可以看出, asar 的核心实现就是对 nodejs 的 fs 模块进行重写。
7.3 源码保护
避免源码泄漏,按照从低到高的源码安全,可以分为以下程度
asar
代码混淆
WebAssembly
Language bindings
其中,Language bindings 是最高的源码安全措施,其实使用 C++ 或 Rust 代码来编写 electron 应用代码,通过将 C++ 或 Rust 代码编译成二进制代码后,破译的难度会变高。这里我说下如何使用 Rust 去编写 electron 应用代码。
方案:使用 napi-rs 作为工具去编写,如下图所示:
我们采用 pnpm-workspace 去管理 Rust 代码,使用 napi-rs ,比如我们写一个 sum 函数,rs代码如下:
fn sum(a: f64, b: f64) -> f64 { a + b } 此时我们加上 napi 装饰代码,如下所示:
use napi_derive::napi;
#[napi] fn sum(a: f64, b: f64) -> f64 { a + b }
在通过 napi-cli 将上述代码编译成 node 可以调用的二进制代码。
编译后,在electron使用上述代码,如下所示:
import { sum as rsSum } from '@rebebuca/native' // 输出 7 console.log(rsSum(2, 5)) napi-rs 的使用请阅读官方文档,地址是:https://napi.rs/(opens new window)
至此,language bindings 的阐述就完成了。我们通过这种方式,可以完成对重要功能的源码保护。
7.4 应用安全
目前熟知的一个安全问题是克隆,此问题的主流解决方案是将用户认证信息和应用设备指纹进行绑定,整体流程如如下图所示:
应用设备指纹生成:可以用上文阐述的 napi-rs 方案去实现
用户认证信息和设备指纹绑定:使用服务端去实现
7.5 编码安全
主要有以下措施:
常用的 web 安全,比如防 xss 、 csrf
设置 node 可执行环境
窗体开启安全选项
限制链接跳转
以上具体细节不再介绍,自行搜索上述方案。除此之外,还有个官方推荐的最佳安全实践,有空可以看看,地址如下:
https://www.electronjs.org/docs/latest/tutorial/security(opens new window)