
敏感信息泄露通常不会出现在某一个环节上,而是在整个过程中都存在风险,包括收集、保存、传输、记录以及导出等各个阶段。一个可以实际操作的脱敏标准并不是简单地隐藏数据,而是根据具体情况来划分等级:有些需要加密并且可以还原,有的只需要打码,还有一些则不应该被记录下来。
存储层:字段级别的加密比整个数据库进行透明加密要好一些
开启TDE只能防止硬盘被偷走,并不能阻止应用程序从数据库中导出数据。最有效的办法是进行字段级别的加密:
- 手机号码、身份证号和银行卡号用AES-256-GCM或者国密SM4列级加密的方式来进行保护,使用信封加密来存储数据,即先用DEK对数据进行加密,再用KMS中的主密钥对DEK进行加密。
- 不能进行逆向运算的密码算法,采用Argon2、bcrypt或者scrypt等带盐值的慢速哈希函数。
- 对于需要准确查找的数据(例如手机号码),可以另外增加一个HMAC摘要来建立索引,在每次解密之后再进行比较。
- 密钥和数据进行物理上的分离,不允许直接写入代码中,按照版本号进行更换,对以前的数据也具备解密密钥。
日志层:采集即脱敏,明文不落盘
日志就是高频泄漏点,错误堆栈、请求体、SQL 调试信息等常常包含完整的个人信息。
- 把脱敏Layout和Filter挂在日志框架层上,用正则表达式来匹配手机号码、身份证号、银行卡号以及Token等敏感信息,其中手机号码只取前三位和后四位,身份证也只取前六位和后四位。
- 把IP地址最后一位设为0或者进行地理编码,去掉鉴权头、Cookie和CVV。
- 脱敏工作是在数据采集的时候做的,没有明文进入消息队列、文件或者第三方的日志SaaS中。
- 审计日志中只有“谁、什么时候、检查了哪些字段”的信息,没有具体的原始数据。
传输和API层:默认脱敏,根据权限恢复
- 全站使用TLS 1.3和HSTS,内部RPC采用mTLS方式传输数据,避免内网明文传输。
- 对外API的默认响应是脱敏视图,只有经过授权的才能看到完整的明文数据(动态脱敏网关)。
- 接口进行资源所有权验证:订单号和用户ID要和令牌主体相关联,否则返回404而不是403并带有数据。
- 第三方回调验签、时间戳和nonce来防止重复请求;导出接口需要经过审批流程,在测试环境中使用不可逆的数据进行脱敏处理。
兜底
掩码并不是最终目的,低强度的脱敏可以通过区域代码、出生日期和性别来恢复。要采用k-匿名性进行评估:任意准标识符组合至少对应k条数据(k≥5),唯一的等价类要进行泛化或者抑制。测试数据库、备份数据库、CDN缓存以及离职员工的信息也要被删除和脱敏。
敏感数据治理并不是简单的加密模块叠加,而是采用“分级分类+最小暴露面+全链路策略一致”的方式来进行的。存储加密保证静态安全,日志掩码减少明文传播范围,API动态脱敏控制输出边界,把密钥、权限和审计串联起来之后就可以把泄露半径限制在一个点上。