做系统总会碰到这个拷问:用户的手机号、身份证号、银行卡号,在数据库里是明文躺着的吗?拖库事件隔三差五上新闻,明文存储意味着一次泄露就是全量裸奔;更现实的压力来自合规——个人信息保护相关法规明确要求敏感个人信息采取加密等措施,审计的时候"我们数据库有密码"是过不了关的。
核心矛盾是:加密能防泄露,但加密会牺牲查询能力和开发便利性,加在哪个层面,决定了安全与成本的平衡点在哪个位置。 业界有三条主流路线:应用层字段加密、数据库透明加密(TDE)、KMS 托管密钥加信封加密,安全强度和改造成本逐级变化。
原理: 应用在写库前对敏感字段加密(AES 等对称算法),密文入库;读库后在应用内解密。密钥由应用侧管理(配置文件、环境变量或密钥服务)。数据库从头到尾只见密文。
优点:
缺点:
适用场景: 敏感字段明确且不多(手机号、身份证、银行卡)的业务系统。绝大多数互联网和 To B 系统的主力方案,配合盲索引解决查询问题。
原理: 数据库层面的加密:数据文件、日志、备份在磁盘上加密存储,内存中是明文。应用完全无感知,SQL 该怎么写还怎么写。MySQL、Oracle、SQL Server 及主流云数据库都支持。
优点:
缺点:
适用场景: 合规要求"存储加密"的基线场景,作为兜底防线。注意它的定位是防"介质丢失",不能替代应用层加密。
原理: 引入密钥管理服务(云厂商 KMS 或自建 Vault):每个数据用随机数据密钥(DEK)加密,DEK 再由 KMS 里的主密钥(KEK)加密后随数据存储——这就是信封加密。主密钥不出 KMS,加解密通过 API 调用,密钥轮换、权限、审计由 KMS 统一管理。
优点:
缺点:
适用场景: 金融、医疗、政务等强合规行业,或对密钥治理有明确要求的大中型组织。中小型系统用云 KMS 的托管版本,运维负担可以接受。
场景特征 | 推荐方案 |
|---|---|
一般业务系统、敏感字段明确 | 应用层字段加密(配盲索引) |
存量系统快速合规、防介质丢失 | TDE 透明加密 |
强合规行业、密钥治理要求高 | KMS + 信封加密 |
生产环境的常见姿势 | 应用层加密为主 + TDE 兜底 + KMS 管密钥 |
实战中的稳妥组合是三道防线:应用层对手机号等字段加密保证"拖库不拖明文",TDE 保证"拿盘拿不到数据",密钥统一进 KMS 保证"密钥本身不失控"。单层防护都有盲区,分层才能闭环。
第一件:先盘清楚要加密什么。 把敏感字段清单列出来分级:手机号身份证是一级,地址姓名是二级,业务数据另算。全表加密是懒政也是灾难,加密范围按合规要求和泄露后果圈定。
第二件:查询需求先于加密方案确认。 手机号要不要支持后四位查询?身份证要不要支持脱敏展示?这些需求决定要不要盲索引、要不要格式保留加密。先加密后想查询,返工是注定的。
第三件:密钥的生命周期要有人管。 密钥怎么生成、多久轮换、谁能用、泄露了怎么吊销重加密,写成制度而不是口头约定。加密系统的事故大多不是算法被破,是密钥管理失控。
敏感数据加密的核心不是"用什么算法",而是"加密落在哪一层、密钥归谁管"。明文入库的时代已经过去了,合规和泄露风险都不允许。方案选型跟着合规强度走,但分级清单、查询预案、密钥制度这三件事,哪条路线都绕不开。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。