可以使用 SQLite 加密扩展 (SEE) 的副本创建 JavaScript/WASM 版本,但这样做存在一些注意事项。
此项目不提供预构建的 WASM SEE 版本。需要 SEE 版本的用户必须自己创建构建(请参见下面的说明)。同样,此类构建也没有 npm 包(或类似的),并且 SEE 许可证禁止这种分发,因此使用 SEE 的客户端必须以传统方式,使用纯 JS 和无包管理器来完成。
SEE 的许可证与通过客户端 WASM 分发 SQLite 相冲突。官方立场是,SEE 许可证持有者可以在其组织内的私有/内部网络应用程序中托管一个支持 SEE 的 WASM 构建,但不能在面向公众的网站上托管 SEE WASM 构建,也不能托管给未获得 SEE 许可的组织。请注意,"服务器端" WASM 构建不受 SEE 许可证的影响,但此页面专门介绍浏览器端 WASM 的使用。
此处只能使用不需要第三方库依赖关系的加密选项。简而言之,这意味着客户端仅限于
sqlite3-see.c
源文件,而不是其他sqlite3-see-XYZ.c
变体之一。在 JavaScript 中没有可靠的方法来隐藏 SEE 加密密钥。任何加载支持 SEE 的网站的用户都可以随意检查 JavaScript 代码和其他资产。确保加密密钥保持秘密的唯一方法是要求最终用户手动输入它们(注意,浏览器端密码管理器会帮助提供保存它们的选项)。
对于 持久存储选项 而言,加密可以说是多余的,因为底层数据被锁定在特定于浏览器的存储中,即使对浏览器的用户来说也是不可读的。有人可能会说,任何拥有某个用户登录信息和浏览器直接访问权限的人都可以读取内容,但"物理访问胜过所有安全措施"的反驳也适用(请参阅上面关于密码管理器的说明)。在非持久存储模式下,加密是多余的,因为数据库仅存在于内存中。SEE 特别不会加密内存中或临时的数据库,而非持久存储选项实际上是通过(短暂的)类似文件系统的路径访问的内存中数据库。
创建支持 SEE 的 WASM 构建
构建 SQLite WASM 包需要安装了 Emscripten 工具的 Linux 系统。安装这些工具的说明可以在 规范的 sqlite 源代码树 中找到。
安装完成后,创建 SEE 包就像在 SQLite 规范源代码树 的签出副本的顶层目录中执行以下操作一样简单。
$ ./configure --enable-all # or preferred flags
$ cd ext/wasm
$ . /path/to/emsdk_env.sh # part of the Emscripten tools
$ make sqlite3.c=/path/to/sqlite3-see.c # needs to be an absolute path
生成的构建工件都可以在 jswasm
子目录中找到。构建时间当然会根据系统而异。中等配置的 x64 机器通常在大约 45 秒内完成构建。
对于只创建支持 SEE 的构建并且反复创建的用户,可以通过将 sqlite3-see.c
的副本或符号链接放置在构建树的顶层目录中来简化上述操作。
$ ln -s /path/to/sqlite3-see.c . # only needed once
$ ./configure --enable-all # or preferred flags
$ cd ext/wasm
$ . /path/to/emsdk_env.sh # part of the Emscripten tools
$ make
请注意,构建可以使用 -j#
标志并行执行,其中 #
是要运行的并行 make
实例的数量。但是,构建中最耗时的部分不会从这种并行化中获益,因此将 #
设置为任意高值不会显着加快构建速度1。
如果一切顺利,构建的输出将以类似以下内容开头。
$ make
using emcc version [3.1.57]
This is an SEE build.
...
如果该 "SEE" 行(或类似的)没有出现,则构建不支持 SEE。也可以检查生成的 JS 源代码以确定它是否是 SEE 构建。
$ grep -w sqlite3_key_v2 jswasm/sqlite3.js
如果产生任何输出,则生成的构建支持 SEE。
在 SEE 构建和非 SEE 构建之间交替时,需要在每次构建之间运行 make clean
,否则构建可能会直接失败或在不包含 SEE API 的情况下静默失败。
使用 SEE 构建
SEE 构建的使用方式与主发行版相同,但还包括与加密相关的各种 sqlite3 API 函数,例如 sqlite3_key_v2()
。这些函数不是使用加密所必需的,因为每个此类 API 也都可以通过 pragma 访问,如 SEE 文档 中所述。JS/WASM 构建中存在特定于 SEE 的函数可以用来将其与非 SEE 构建区分开来。
从 3.46 版开始,oo1 API 支持 SEE,其形式为 DB
类及其子类的构造函数的可选参数。
- ^ 由于涉及如何构建
sqlite3.wasm
的一些漫长而枯燥的技术原因。