星澜

天接云涛连晓雾,星河欲转千帆舞

敏感数据方案设计 V1

mingzaily / 2023-08-31


一、方案定位与核心目标

1. 定位

针对中小型项目或轻量业务场景(如用户中心、会员系统),通过 “独立加密服务 + 业务服务协作” 的模式,结合 “字段拆分” 设计,实现身份证号、手机号等敏感信息的安全存储与查询。无需部署重量级中间件,兼顾成本控制与基础安全合规要求,适配现有微服务架构。

2. 核心目标

二、方案架构设计(独立服务协作模式)

1. 整体架构

核心为 “业务服务 + 独立加密服务 + 存储层” 的协作架构,服务间通过 API 契约交互,各组件职责明确,可独立部署与扩展:

2. 核心组件说明

组件 核心职责 关键交互逻辑
业务服务集群 1. 接收用户 / 运营端请求;2. 调用加密服务处理敏感信息;3. 读写业务数据库;4. 返回业务结果并记录日志 1. 通过 HTTP/GRPC 调用加密服务 API;2. 执行 SQL 操作业务数据库
加密服务集群 1. 提供加密、解密、哈希验证 API;2. 内置密钥管理(存储于 KMS 或本地安全文件);3. 记录操作审计日志;4. 实现防重放、限流等安全防护 1. 响应业务服务的 API 请求;2. 内部读写密钥与审计日志
业务数据库 1. 存储 “加密字段 + 哈希字段 + 预留特征字段”;2. 无任何完整明文敏感信息 仅接收业务服务的 SQL 操作,拒绝其他直接访问
业务日志存储 记录业务服务的操作日志(如用户上传敏感信息、运营查询用户列表),支撑业务问题排查 仅接收业务服务的日志写入请求

三、核心设计细节

1. 数据库字段拆分规则(核心安全设计)

针对不同敏感信息,采用 “三段式字段拆分”,确保单字段泄露无风险,同时适配查询需求:

(1)身份证号字段设计(用户表)

字段名 类型 长度 用途说明 安全属性
id_card_enc VARCHAR 255 存储加密服务返回的身份证号密文;仅用于 “存储”,不参与查询 敏感(需密钥解密)
id_card_hash VARCHAR 64 存储加密服务生成的 SHA-256 哈希值(带随机盐);用于 “精准查询”(如验证身份证号唯一性) 非敏感(不可反推明文)
id_card_reserve VARCHAR 20 存储身份证号前 6 位(行政区划码)+ 后 4 位;用于 “固定模糊查询”(如筛选某地区用户) 非敏感(公开信息)

(2)手机号字段设计(用户表)

字段名 类型 长度 用途说明 安全属性
phone_enc VARCHAR 255 存储加密服务返回的手机号密文;仅用于 “存储”,不参与查询 敏感(需密钥解密)
phone_hash VARCHAR 64 存储加密服务生成的 SHA-256 哈希值(带随机盐);用于 “精准查询”(如手机号登录验证) 非敏感(不可反推明文)
phone_reserve VARCHAR 20 存储手机号前 7 位(归属地编码);用于 “固定模糊查询”(如筛选某运营商 / 地区用户) 非敏感(公开信息)

设计原则

备注:加密字段仅用于数据存储,禁止作为查询条件;哈希字段必须带随机盐值,避免彩虹表反推风险;预留字段需根据业务查询需求提前定义,仅保留非敏感特征。

2. 加密服务核心能力(安全边界封装)

加密服务是方案的安全核心,所有敏感操作均在内部封装,对外仅暴露标准化 API:

(1)核心 API 设计(GRPC/HTTP 双支持)

API 名称 请求参数 返回结果 用途说明 安全控制
EncryptData data(明文)、type(idcard/phone) encrypted_data(密文)、hash(哈希值)、request_id 加密敏感信息,同步返回密文与哈希值 1. 需 appId+appSecret 认证;2. 请求需携带时间戳 + 签名(防篡改)
DecryptData encrypted_data(密文)、type(idcard/phone) data(明文)、request_id 解密敏感信息,返回明文 1. 需 appId+appSecret 认证;2. 单 IP 限流(默认 100 QPS)
VerifyHash data(明文)、hash(存储的哈希值)、type is_match(布尔值)、request_id 验证明文与存储的哈希值是否匹配 需 appId+appSecret 认证

(2)内置安全能力(无需业务服务关注)

备注:加密服务需独立部署,禁止与业务服务混部;API 签名密钥需定期更换(建议每 3 个月),更换时需提前同步给业务服务,避免接口调用失败;审计日志需包含完整操作上下文,便于泄露事件追溯。

四、安全与运维设计

1. 权限管控(边界隔离)

备注:权限审批需留痕,临时权限有效期不得超过 24 小时;数据库访问需开启 SQL 审计,记录所有查询操作,重点监控敏感字段的访问行为。

2. 高可用保障

备注:加密服务需配置熔断机制,当调用失败率超过 5% 时自动触发降级,避免级联故障;数据库主从同步延迟需控制在 1 秒内,确保查询结果一致性。

3. 合规性落地(基础等保要求)

备注:脱敏规则需统一(如手机号中间 4 位脱敏、身份证号中间 8 位脱敏),禁止部分场景脱敏、部分场景明文;备份文件需定期(每月 1 次)验证恢复有效性,避免备份失效;应急响应预案需每季度演练 1 次,确保故障发生时可快速处理。

五、常用问题解答(FAQ)

1. 业务服务与加密服务通信延迟高怎么办?

备注:可在业务服务端对高频查询的哈希值做本地缓存(如 Redis 缓存,有效期 5 分钟),减少加密服务调用次数,但需注意缓存失效时的一致性问题。

2. 为什么要单独做加密服务,不直接在业务服务中实现加密逻辑?

备注:若业务服务直接实现加密逻辑,需在每个服务中维护密钥,易导致密钥泄露;且不同业务服务可能采用不同加密算法,增加安全管控复杂度,不符合 “安全逻辑集中化” 原则。

3. 预留字段能支持多维度模糊查询吗(如手机号前 3 位 + 后 4 位)?

备注:预留字段的设计需结合实际业务查询需求,避免过度冗余;若需支持多维度查询,可将预留字段拆分为多个子字段(如 phone_prefix3、phone_suffix4),便于精准匹配,提升查询性能。

六、方案优势与适用场景

1. 核心优势

2. 适用场景