`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 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
1.804979s