WebSQL 无原生加密能力,因其基于轻量SQLite且未设计访问控制或加密模块,数据明文存储;安全方案需应用层用Web Crypto API(如AES-GCM)加密敏感字段,密钥由密码派生,IV随机生成并同存,同时建议迁移到IndexedDB或避免前端存敏感数据。

WebSQL 数据库本身不提供加密能力,HTML5 标准中也没有内置的 WebSQL 加密机制。所谓“HTML5 加密 WebSQL”实际是开发者在应用层自行实现的数据加解密流程,并非浏览器原生支持的功能。
为什么 WebSQL 无法原生加密?
WebSQL 是基于 SQLite 的客户端数据库接口,其设计目标是轻量、快速、兼容已有 SQLite 生态,但不包含访问控制、权限管理或数据加密模块。所有数据以明文形式存储在用户本地(如 Chromium 的 Local Storage 目录下),浏览器不会自动加密或混淆内容。
可行的加密存储方案(应用层实现)
要在 WebSQL 中“安全存储敏感数据”,必须在写入前加密、读取后解密。关键点如下:
-
选择合适的加密算法:推荐使用 Web Crypto API 的
AES-GCM(支持认证加密,防篡改),避免已淘汰的 DES、RC4 或无认证的 AES-CBC。 - 密钥不能硬编码或存在前端代码中:可由用户密码派生(如用 PBKDF2 + 用户输入生成密钥),或结合服务端动态下发(需注意传输安全)。
- 加密粒度建议按字段或记录进行:例如只对“身份证号”“手机号”等敏感字段加密,而非整张表;避免对索引字段加密,否则无法高效查询。
-
注意 IV(初始化向量)的处理:每次加密需生成随机 IV,并与密文一同存入 WebSQL(如新增
iv字段),解密时一并读取。
简单示例:插入一条加密记录
假设用用户密码派生密钥,加密字段 id_card:
立即学习“前端免费学习笔记(深入)”;
// 1. 从密码派生密钥(简化示意)
const key = await deriveKey(password, 'AES-GCM');
// 2. 加密身份证号
const iv = window.crypto.getRandomValues(new Uint8Array(12));
const encoded = new TextEncoder().encode(idCard);
const encrypted = await window.crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, encoded);
// 3. 存入 WebSQL(明文字段+加密字段+IV)
tx.executeSql('INSERT INTO users (name, id_card_enc, iv) VALUES (?, ?, ?)',
[name, arrayBufferToBase64(encrypted), arrayBufferToBase64(iv)]);
重要提醒与替代建议
WebSQL 已被 W3C 废弃,Chrome、Edge 等现代浏览器虽暂未移除,但不再更新且不推荐新项目使用。更合理的长期方案包括:
- 迁移到 IndexedDB + Web Crypto:功能更丰富,支持异步、大容量、二进制存储,配合加密更可控;
- 敏感数据尽量不上客户端:通过 token 鉴权调用后端接口处理,前端只缓存非敏感标识;
- 若必须本地强保护,考虑 Secure Enclave(iOS)或 Android Keystore 配合 PWA 原生桥接(需混合开发)。











