Setter 不执行加密或切片,而是拦截大资产并触发分块加密流程:识别规模、暂存原始数据、生成任务ID、启动微任务切片加密;配合Proxy实现字段级策略,Getter按需解密。

Setter 本身不执行加密或切片,但它可以作为安全处理大资产的“启动开关”——真正起作用的是它触发后的分块逻辑、加密调用与暂存策略。关键在于把原始数据拦截下来,不直接存入响应式状态,而是走一条可控、可审计、带加密的暂存路径。
用 Setter 拦截并启动受控加密流程
当用户传入一个大文件、长数组或 ArrayBuffer 时,Setter 应第一时间识别其规模(如 Blob.size > 2MB 或 Array.length > 5000),然后:
- 阻止原始值直接赋给响应式字段,避免内存暴增或明文暴露
- 将原始数据暂存在闭包或 WeakMap 中,确保仅内部逻辑可访问
- 生成唯一任务 ID,并初始化加密上下文(如 AES-GCM 密钥派生、IV 缓存)
- 立即调用 queueMicrotask 启动首块切片 + 加密任务,不阻塞渲染
按块加密并分段暂存到安全位置
切片不是简单地 slice(),而是“切—加—存”闭环。每一块都应独立完成端到端保护:
- 单块大小建议控制在 64KB–256KB,兼顾加密效率与主线程响应性
- 使用 SubtleCrypto.encrypt() 对每块执行 AEAD 加密(推荐 AES-GCM),附带认证标签
- 加密后结果存入 Map(内存暂存)或 IndexedDB(需持久化),键为
taskId + sliceIndex - 维护一个轻量元数据对象:
{ taskId, totalSlices, encryptedCount, ivSeed },供恢复或校验用
结合 Proxy 实现动态属性级加密策略
单一 Setter 难以覆盖嵌套结构或运行时新增字段。改用 Proxy 可统一管控:
- 在
settrap 中识别关键词(如asset、payload、encryptedData)自动启用切片加密流程 - 支持字段级策略:例如
user.photo启用 AES-256,而user.notes用 ChaCha20-Poly1305 - 写入时若检测到已加密数据(如含
enc:前缀或iv字段),跳过重复加密,只做完整性校验 - 搭配 FinalizationRegistry 监听对象销毁,在切片长期未访问时自动清除内存中的密钥和明文块
解密读取也应透明可控(Getter 协同)
暂存不是终点,安全读取同样重要。可通过 Getter 实现“按需解密”:
- 定义
get decryptedAsset(),首次访问某 slice 时才调用 SubtleCrypto.decrypt() - 解密结果可缓存(如用私有
#decryptedCacheMap),但需绑定生命周期,避免敏感数据驻留过久 - 对高敏感字段(如身份证号片段),Getter 可强制要求二次确认(如
prompt(‘确认查看?’))再解密 - 避免在 getter 中执行完整解密——应只解当前请求 slice,其余保持加密态静默
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











