`title: WebCrypto 加密存储实践:IndexedDB 与 OPFS``categories: Web 开发/前端/数据管理``keywords: WebCrypto,SubtleCrypto,AES-GCM,加密,密钥管理,IndexedDB,OPFS``description: 使用 WebCrypto 的 AES-GCM 在浏览器端对数据加密后存储到 IndexedDB 或 OPFS,并提供密钥生成与导出导入的实践。`密钥生成与导出async function genKey() {

return crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);

}

async function exportRawKey(key) {

return new Uint8Array(await crypto.subtle.exportKey('raw', key));

}

async function importRawKey(raw) {

return crypto.subtle.importKey('raw', raw, { name: 'AES-GCM' }, true, ['encrypt', 'decrypt']);

}

加密与解密async function encrypt(key, data) {

const iv = crypto.getRandomValues(new Uint8Array(12));

const enc = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, data);

return { iv, cipher: new Uint8Array(enc) };

}

async function decrypt(key, iv, cipher) {

const dec = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, cipher);

return new Uint8Array(dec);

}

存储到 OPFS 与 IndexedDBasync function saveCipherToOPFS(name, bytes) {

const root = await navigator.storage.getDirectory();

const handle = await root.getFileHandle(name, { create: true });

const writable = await handle.createWritable();

await writable.write(bytes);

await writable.close();

}

function openKeyDB() {

return new Promise((resolve, reject) => {

const req = indexedDB.open('crypto-db', 1);

req.onupgradeneeded = () => {

const db = req.result;

if (!db.objectStoreNames.contains('keys')) db.createObjectStore('keys', { keyPath: 'id' });

};

req.onsuccess = () => resolve(req.result);

req.onerror = () => reject(req.error);

});

}

async function storeKey(db, id, raw) {

return new Promise((resolve, reject) => {

const tx = db.transaction('keys', 'readwrite');

tx.objectStore('keys').put({ id, raw: Array.from(raw) });

tx.oncomplete = () => resolve();

tx.onerror = () => reject(tx.error);

});

}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部