WebSQL 无原生加密能力,因其基于轻量SQLite且未设计访问控制或加密模块,数据明文存储;安全方案需应用层用Web Crypto API(如AES-GCM)加密敏感字段,密钥由密码派生,IV随机生成并同存,同时建议迁移到IndexedDB或避免前端存敏感数据。
WebSQL 数据库本身不提供加密能力,HTML5 标准中也没有内置的 WebSQL 加密机制。所谓“HTML5 加密 WebSQL”实际是开发者在应用层自行实现的数据加解密流程,并非浏览器原生支持的功能。
WebSQL 是基于 SQLite 的客户端数据库接口,其设计目标是轻量、快速、兼容已有 SQLite 生态,但不包含访问控制、权限管理或数据加密模块。所有数据以明文形式存储在用户本地(如 Chromium 的 Local Storage 目录下),浏览器不会自动加密或混淆内容。
要在 WebSQL
中“安全存储敏感数据”,必须在写入前加密、读取后解密。关键点如下:
AES-GCM(支持认证加密,防篡改),避免已淘汰的 DES、RC4 或无认证的 AES-CBC。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 等现代浏览器虽暂未移除,但不再更新且不推荐新项目使用。更合理的长期方案包括: