概叙
科普文:架构设计之支付系统设计_支付系统架构设计-CSDN博客
实战:springboot之api返回数据脱敏和Logback日志脱敏_slf4j日志脱敏-CSDN博客
科普文:Java基础系列之【java加密/解密、签名】_java公钥加密私钥解密-CSDN博客
在支付系统中存储敏感信息如身份证号、银行卡号、地址、姓名和手机号时,需要采取一系列的安全措施来保护用户隐私和数据安全,这些敏感信息的存储需遵循最小化采集、分级加密、访问隔离 原则,结合安全合规要求与性能平衡。
存储策略
- 加密存储:敏感信息如身份证号、银行卡号等应进行加密存储。加密后的数据即使被窃取也无法直接用于非法活动。
- 分离存储:将敏感信息存储在独立的数据库或服务器中,并与主要业务数据分离,以减少敏感信息泄露的风险。
- 访问控制:严格限制对敏感信息的访问权限,只有经过授权的人员才能访问这些信息,并且访问记录应详细记录。
- 数据脱敏:在数据处理和传输过程中,对敏感信息进行脱敏处理,避免直接暴露真实信息。
- 定期审计:定期对存储的敏感信息进行审计,确保没有未授权的访问和不当使用。
字段类型 | 敏感等级 | 存储方式 | 技术实现 |
---|---|---|---|
身份证号 | 高 | 加密存储(密文) + 部分脱敏(如仅存储前3位和后4位,其余用*替代) | AES-256加密,密钥由硬件加密机(HSM)管理 |
银行卡号 | 高 | 完整密文存储(符合PCI-DSS标准) + 脱敏展示(如显示前6位和后4位) | 加密后存储至PCI专用数据库分区,主密钥通过HSM隔离 |
手机号 | 中 | 加密存储(密文) + 绑定设备指纹/IP风控 | 采用国密SM4或AES-GCM加密,结合盐值(Salt)防彩虹表攻击 |
地址 | 低 | 非敏感场景可明文存储;涉及风控时加密 | 按业务需求选择:明文存储(地址库关联)或加密存储(如哈希+模糊匹配) |
姓名 | 中 | 加密存储(密文) + 脱敏展示(如“张*三”) | 与身份证号绑定加密,仅授权服务可解密 |
具体技术实现
- 使用硬件安全模块(HSM):将加密密钥存储在硬件安全模块中,增加密钥管理的安全性。
- 采用强加密算法:如AES-256等强加密算法,确保数据在存储和传输过程中的安全性。
- 日志管理:敏感信息的操作日志应进行加密处理,防止通过日志获取敏感信息。
- 定期更新和审计:定期更新加密算法和密钥,并对存储的敏感信息进行定期审计,确保没有异常访问。
存储架构设计要点
-
数据库分层隔离
- PCI合规区:存储银行卡号、CVV等PCI-DSS强管控字段,使用专用加密数据库(如Oracle TDE)或云厂商KMS服务。
- 普通加密区:存储身份证号、手机号等字段,通过分库分表隔离敏感数据,禁止JOIN操作。
- 日志脱敏区:日志中仅记录脱敏后的数据(如
138‌****‌1234
),禁止明文输出敏感字段。
-
密钥管理
- 主密钥:由硬件加密机(HSM)生成和存储,禁止落盘。
- 数据密钥:动态生成并加密存储,每次加密使用独立密钥,定期轮换。
-
访问控制
- 权限隔离:敏感字段仅允许风控、支付核心服务访问,通过RBAC模型控制。
- 审计追踪:记录所有敏感数据访问日志,支持操作溯源(如谁在何时解密了某银行卡号)。
安全增强措施
-
传输加密
- 前端到服务端:强制HTTPS + TLS 1.3,敏感字段二次加密(如RSA非对称加密)。
- 服务间通信:通过双向TLS(mTLS)或服务网格(如Istio)保障内网传输安全。
-
数据生命周期管理
- 存储时效:临时数据(如验证码)设置短时TTL,持久化数据定期归档清理。
- 备份加密:数据库备份文件需加密,且与生产环境密钥分离。
-
合规与审计
- 符合PCI-DSS、GDPR、中国《个人信息保护法》要求,定期渗透测试与合规审计。
- 敏感数据存储区域启用防火墙白名单策略,仅允许授权IP段访问。
法律和合规性
- 遵守相关法律法规:确保存储和处理敏感信息符合当地的隐私保护法律法规,如GDPR、CCPA等。
- 用户知情同意:在收集和处理敏感信息前,必须获得用户的明确同意,并在用户协议中明确告知信息收集的目的和使用方式。
- 数据最小化原则:只收集和处理必要的敏感信息,避免过度收集用户数据。
- 跨境数据传输合规:如果涉及跨境数据传输,需确保符合相关国家和地区的跨境数据传输规定。
实现示例(MySQL)
创建一张用户信息表,字段包括:自增主键、姓名、手机号、身份证号码、银行卡号码、地址。
表设计要求如下:
- 1.姓名存两个字段:姓存明文、整个姓名用sha-256加密成唯一的字符串。
- 2.手机号存三个字段:前三位运营商代码存明文,11位手机号存用sha-256加密成唯一的字符串,手机号归属地存明文。
- 3.身份证号码存两个字段:前6位地址码存明文、18位身份证号用sha-256加密成唯一的字符串。
- 4.银行卡号码存三个字段:前2位存明文、前6位BIN码存用sha-256加密成唯一的字符串、整个银行卡存用sha-256加密成唯一的字符串。
- 5.地址存两个字段:省市县镇存行政编号的明文,整个地址用sha-256加密成唯一的字符串。
CREATE TABLE `user_info` (
-- 主键
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键',
-- 姓名(SHA-256加密)
`first_name` VARCHAR(50) NOT NULL COMMENT '姓(明文)',
`encrypted_full_name` CHAR(64) NOT NULL COMMENT '完整姓名SHA-256加密值',
-- 手机号(SHA-256加密)
`operator_prefix` CHAR(3) NOT NULL COMMENT '手机号前3位(运营商代码明文)',
`encrypted_phone` CHAR(64) NOT NULL COMMENT '11位手机号SHA-256加密值',
`phone_location` VARCHAR(20) NOT NULL COMMENT '手机归属地(明文)',
-- 身份证(SHA-256加密)
`id_card_prefix` CHAR(6) NOT NULL COMMENT '身份证前6位地址码(明文)',
`encrypted_id_card` CHAR(64) NOT NULL COMMENT '18位身份证SHA-256加密值',
-- 银行卡(SHA-256加密)
`bank_card_prefix` CHAR(2) NOT NULL COMMENT '银行卡前2位(明文)',
`encrypted_bank_card_bin` CHAR(64) NOT NULL COMMENT '前6位BIN码SHA-256加密值',
`encrypted_bank_card_full` CHAR(64) NOT NULL COMMENT '完整银行卡SHA-256加密值',
-- 地址(SHA-256加密)
`region_code` CHAR(10) NOT NULL COMMENT '省市县镇行政编码(明文)',
`encrypted_full_address` CHAR(64) NOT NULL COMMENT '完整地址SHA-256加密值',
-- 时间戳
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-- 唯一索引
UNIQUE KEY `uk_encrypted_full_name` (`encrypted_full_name`),
UNIQUE KEY `uk_encrypted_phone` (`encrypted_phone`),
UNIQUE KEY `uk_encrypted_id_card` (`encrypted_id_card`),
UNIQUE KEY `uk_encrypted_bank_card` (`encrypted_bank_card_bin`, `encrypted_bank_card_full`),
UNIQUE KEY `uk_encrypted_address` (`encrypted_full_address`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户信息表(敏感字段SHA-256加密)';
字段设计说明
1. 姓名字段
字段名 | 类型 | 说明 |
---|---|---|
first_name | VARCHAR(50) | 存储姓氏明文(如"张"),不排除少数民族姓,可能长度超过50字符,根据实际情况可以做调整,一般汉族姓是1-2个字符(单姓、复姓)。 |
encrypted_full_name | CHAR(64) | 完整姓名SHA-256加密值(示例:对"张三"加密后的64位十六进制字符串) |
实现逻辑:
// 示例代码:生成加密值
String fullName = "张三";
String encryptedName = DigestUtils.sha256Hex(fullName); // 使用commons-codec库
2. 手机号字段
字段名 | 类型 | 说明 |
---|---|---|
operator_prefix | CHAR(3) | 运营商代码(如移动: 139,联通: 186) |
encrypted_phone | CHAR(64) | 11位手机号SHA-256加密值 |
phone_location | VARCHAR(20) | 归属地(如"浙江杭州") |
数据示例:
phone = "13812345678"
operator_prefix = "138"
encrypted_phone = DigestUtils.sha256Hex(phone)
phone_location = "北京"
3. 身份证字段
字段名 | 类型 | 说明 |
---|---|---|
id_card_prefix | CHAR(6) | 地址码(如北京市东城区: 110101) |
encrypted_id_card | CHAR(64) | 18位身份证SHA-256加密值 |
加密逻辑:
id_card = "31010419900520123X"
id_card_prefix = "310104"
encrypted_phone = DigestUtils.sha256Hex(id_card)
4. 银行卡字段
字段名 | 类型 | 说明 |
---|---|---|
bank_card_prefix | CHAR(2) | 卡号前2位(如招商银行: 62) |
encrypted_bank_card_bin | CHAR(64) | 前6位BIN码SHA-256加密值(如"622588") |
encrypted_bank_card_full | CHAR(64) | 完整卡号SHA-256加密值 |
加密逻辑:
中国农业银行 卡号:6223481828196117070
bank_card = "6223481828196117070"
bank_card_prefix = DigestUtils.sha256Hex("622348")
encrypted_phone = DigestUtils.sha256Hex(bank_card )
注意要点:
- BIN码加密可用于反查发卡行,但不暴露完整卡号
- 完整卡号加密保证唯一性
5. 地址字段
字段名 | 类型 | 说明 |
---|---|---|
region_code | CHAR(6) | 行政编码(如杭州市西湖区: 330106) |
encrypted_full_address | CHAR(64) | 完整地址SHA-256加密值(如"浙江省杭州市西湖区文三路100号") |
安全增强措施
-
加密算法选择:
- 使用
SHA2(str, 256)
替代MD5等弱哈希算法 - 建议应用层加密后存储,避免SQL日志泄露原文
- 使用
-
访问控制:
-- 禁止非授权用户访问加密字段 CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword!'; GRANT SELECT (id, first_name, phone_location) ON user_info TO 'app_user';
-
审计日志:
-- 开启数据库审计(MySQL企业版) INSTALL COMPONENT "file://component_audit_api"; SET GLOBAL audit_log_policy = ALL;
典型查询场景
场景1:通过加密值反查用户
-- 通过手机号密文查询用户
SELECT first_name, phone_location
FROM user_info
WHERE encrypted_phone = '5f9c7a...';
场景2:统计区域用户数量
-- 按行政编码统计
SELECT region_code, COUNT(*)
FROM user_info
GROUP BY region_code;
场景3:验证银行卡唯一性
-- 插入前校验重复
SELECT COUNT(*)
FROM user_info
WHERE encrypted_bank_card_full = SHA2('6225881234567890123', 256);
设计亮点总结
- 分级存储:结合明文片段与哈希值,平衡业务需求与安全
- 哈希唯一性:通过SHA-256保证敏感数据不可逆且唯一
- 最小化存储:仅保留必要的明文片段(如运营商代码、行政编码)
- 合规性:符合《个人信息保护法》关于敏感信息存储的要求
- 可追溯性:通过时间戳字段记录数据变更历史
中国手机号码编码规则解析
一、号码结构与编码逻辑
-
基础结构:中国手机号码统一为11位,按功能划分为三部分:
- 第8-11位:用户随机分配码(唯一性标识)
- 第4-7位:地区编码(归属地标识)
- 前3位:网络识别号(运营商代码)
-
示例解析:以号码13912345678为例:
- 139:中国移动号段
- 1234:归属地编码(如北京“010”对应中间四位中的部分)
- 5678:用户唯一码。
- 通过上述规则,手机号码既能精准标识用户身份,又兼顾运营商管理与国际兼容性。
-
国际规范适配:遵循国际电信联盟(ITU)E.164标准,总长度含国家代码(中国为“86”)不超过15位。
二、运营商识别规则
-
主要运营商号段
- 中国移动:134-139、147、150-152、157-159、188等
- 中国联通:130-132、155-156、185-186等
- 中国电信:133、149、153、173、177-181、189等
- 虚拟运营商:以170、171、167等号段为主。
-
特殊号段功能:物联网(M2M):以144、146等开头,专用于智能设备联网。
三、地区编码与归属地划分
-
编码规则
- 第4-7位对应用户注册时的行政区域,如“020”代表广州,“021”代表上海。
- 携号转网支持后,归属地可能与实际使用地分离。
-
查询方式:可通过工信部备案平台、运营商APP或第三方工具(如支付宝“一证通查”)验证归属地。
四、号码位数演变与容量设计
-
历史背景
- 早期为10位(如1990年代),后因用户量激增至11位(2000年后)。
- 11位组合容量达千亿级,满足长期需求(如每人多号码分配)。
-
号段扩展:新增号段如“15”“16”“17”等,进一步扩充资源池。
五、特殊用途号码
-
服务类号码
- 短号:如“10086”(移动客服)、“12306”(铁路服务)
- 紧急号码:110、120、119等以“1”开头,与普通手机号区分。
-
未来发展趋势
- 智能号码:结合AI技术实现个性化服务
- 全球统一规范:适应跨国通信需求。
银行卡卡号规则
银行卡号规则是银行系统的重要编码标准,理解其结构有助于快速识别卡片来源、避免换卡时的业务中断,并增强用卡安全性。
一、银行卡号的基本结构
-
位数范围
银行卡号长度一般为16-19位,部分国际卡可能为12-19位。国内银联标准卡多为16-19位,双组织卡(如Visa+银联)可能为13-19位。 -
组成部分
- 前6位:发行者标识代码(IIN/BIN),用于标识发卡银行、卡组织及卡片级别。例如,中国银联卡以62开头,Visa卡以4开头,万事达卡以51-55开头。
- 中间位数(第7至倒数第2位):发卡行自定义位,通常包含账户类型、发卡地区等信息,长度一般为6-12位。
- 最后1位:校验码,通过Luhn算法计算,用于验证卡号合法性。
二、关键编码规则
-
发卡行标识代码(IIN/BIN)
- 第一位数字为主要产业标识符(MII),代表行业分类(如4/5为金融财务,62为中国银联)。
- 前6位可细分银行及卡种。例如,农行普卡以622848开头,金卡以622845开头。
-
银联卡的特殊性
- 国内银联卡主要分为三类:
- 62开头:符合国际标准的银联标准卡,可在境外使用。
- 60开头:早期国际标准卡,逐步被62替代。
- 9开头:仅限国内使用的旧版卡,已逐步淘汰。
- 4开头:信用卡。
- 国内银联卡主要分为三类:
-
校验码计算
最后一位通过Luhn算法生成,用于防止输入错误或伪造。例如,对前15位数字进行加权求和后取模运算。
三、实际应用与注意事项
-
换卡保号规则
- 62开头的银联借记卡到期后,可通过手机银行或网点申请“同号换卡”,但需提前2个月操作。
- 信用卡通常默认不换号,仅更新安全码和有效期。
-
卡号识别技巧
- 通过前6位可快速判断发卡行及卡种。例如,建行借记卡常见以622700开头。
- 部分银行在自定义位中包含分行代码(如农行第4-5位后4位为地区编号)。
身份证规则
规则依据《中华人民共和国居民身份证法》及相关政策制定,确保公民身份信息的准确性和安全性。
身份证号规则
oracle验证公民身份号码_oracle校验表中身份证号码-CSDN博客
中国居民身份证号码采用18位编码规则,由地址码、出生日期码、顺序码和校验码四部分组成,具体规则如下:
一、编码结构分解
-
地址码(前6位)
- 第1-2位:省级行政区代码(如31代表上海)。
- 第3-4位:地级市代码(如3101为上海市辖区)。
- 第5-6位:区县代码(如310104为上海市徐汇区)。
- 地址码依据国家统计局行政区划代码编制,行政区调整可能导致同一地区代码不同37。
-
出生日期码(第7-14位)
- 格式为
YYYYMMDD
,如19900520表示1990年5月20日出生。
- 格式为
-
顺序码(第15-17位)
- 同一地址码区域内,对同年同月同日出生者按登记顺序分配,第17位为性别标识:奇数代表男性,偶数代表女性。
-
校验码(第18位)
- 通过前17位加权求和并取模计算得出,范围为0-10。若结果为10,则用罗马数字
X
代替,以保证总长度为18位。
- 通过前17位加权求和并取模计算得出,范围为0-10。若结果为10,则用罗马数字
二、特殊规则说明
- 大区划分:第1位数字对应解放初期的6大行政区(1-华北,2-东北,3-华东,4-中南,5-西南,6-西北),第2位细化省级单位(如11北京、12天津)。
- 终身唯一性:身份证号码自首次登记后终身不变。
- 校验码作用:用于验证号码有效性,防止输入或传输错误,如银行、政务系统中自动校验。
三、示例解析
以31010419900520123X
为例:
- 310104:上海市徐汇区。
- 19900520:1990年5月20日出生。
- 123:当日第123位登记,第17位“3”(奇数)为男性。
- X:校验码计算结果为10。
身份证有效期规则
根据《中华人民共和国居民身份证法》及相关规定,身份证的有效期规则如下:
- 十六周岁至二十五周岁:身份证有效期为十年。
- 二十六周岁至四十五周岁:身份证有效期为二十年。
- 四十六周岁以上:身份证长期有效。
- 未满十六周岁:自愿申请领取身份证的,有效期为五年。
一、身份证申领与换领规则
- 申领时间:公民应自年满十六周岁之日起三个月内,向常住户口所在地的公安机关申请领取身份证。
- 换领情形:身份证有效期满、姓名变更、证件严重损坏或登记项目出现错误时,需申请换领新证。
- 补领情形:身份证丢失的,应申请补领。
二、身份证使用与查验规则
- 使用范围:身份证用于证明身份,包括常住户口登记项目变更、兵役登记、婚姻登记、申请办理出境手续等。
- 查验情形:人民警察依法执行职务时,可查验身份证,例如对有违法犯罪嫌疑的人员查明身份等。
三、其他重要规则
- 指纹信息:公民申请领取、换领、补领身份证时,需登记指纹信息。
- 临时身份证:在申请领取、换领、补领身份证期间,急需使用身份证的,可申请临时身份证。