概述
整库加密无法防范应用缺陷或权限较弱的只读副本,敏感字段依旧暴露。应用层字段加密把可读性收窄到内存与特定代码路径,代价是丧失数据库对这些字段的搜索与排序能力。
关键步骤
- 写入前用带认证的加密算法与随机 nonce 加密字段。
- 读取后解密,且绝不在日志中记录明文或密钥。
- 对可搜索字段,另存带密钥的哈希(盲索引)列。
- 把字段名及必要时的租户纳入认证数据。
验证
- 静态存储的只有密文,且每行 nonce 唯一。
- 相等查询可借助盲索引完成。
- 密文不能跨字段或跨租户搬用。
- 密钥版本随密文保存,支持轮换。
注意事项
- 应用层加密使这些字段无法在数据库侧做范围查询与排序,除非添加盲索引。
- 若应用处置明文不当,内存或日志中的明文仍会泄露。
适用范围
本条目围绕「在应用层加密敏感字段」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
const nonce = randomBytes(12);
const ct = encrypt(key, plaintext, nonce, aad);
await db.insert({ ciphertext: ct, nonce, keyVersion: 1 });
// blind index for equality lookups
const blind = hmac(indexKey, plaintext.toLowerCase());