← 中文资源

简体中文版本

在应用层加密敏感字段

写入前加密敏感列、读取后解密,按租户使用密钥,并把索引建在确定性派生值而非明文上。

阅读英文原文

概述

整库加密无法防范应用缺陷或权限较弱的只读副本,敏感字段依旧暴露。应用层字段加密把可读性收窄到内存与特定代码路径,代价是丧失数据库对这些字段的搜索与排序能力。

关键步骤

  1. 写入前用带认证的加密算法与随机 nonce 加密字段。
  2. 读取后解密,且绝不在日志中记录明文或密钥。
  3. 对可搜索字段,另存带密钥的哈希(盲索引)列。
  4. 把字段名及必要时的租户纳入认证数据。

验证

  • 静态存储的只有密文,且每行 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());