实战:架构设计之支付系统设计【身份证号、银行卡号、地址、姓名、手机号如何存储?】

概叙

科普文:架构设计之支付系统设计_支付系统架构设计-CSDN博客

实战:springboot之api返回数据脱敏和Logback日志脱敏_slf4j日志脱敏-CSDN博客

科普文:Java基础系列之【java加密/解密、签名】_java公钥加密私钥解密-CSDN博客

在支付系统中存储敏感信息如身份证号、银行卡号、地址、姓名和手机号时,需要采取一系列的安全措施来保护用户隐私和数据安全,这些敏感信息的存储需遵循最小化采集、分级加密、访问隔离‌ 原则,结合安全合规要求与性能平衡

存储策略

  1. 加密存储‌:敏感信息如身份证号、银行卡号等应进行加密存储。加密后的数据即使被窃取也无法直接用于非法活动。
  2. 分离存储‌:将敏感信息存储在独立的数据库或服务器中,并与主要业务数据分离,以减少敏感信息泄露的风险。
  3. 访问控制‌:严格限制对敏感信息的访问权限,只有经过授权的人员才能访问这些信息,并且访问记录应详细记录。
  4. 数据脱敏‌:在数据处理和传输过程中,对敏感信息进行脱敏处理,避免直接暴露真实信息。
  5. 定期审计‌:定期对存储的敏感信息进行审计,确保没有未授权的访问和不当使用。
字段类型敏感等级存储方式技术实现
身份证号加密存储(密文) + 部分脱敏(如仅存储前3位和后4位,其余用*替代)‌AES-256加密,密钥由硬件加密机(HSM)管理‌
银行卡号完整密文存储(符合PCI-DSS标准) + 脱敏展示(如显示前6位和后4位)‌加密后存储至PCI专用数据库分区,主密钥通过HSM隔离‌
手机号加密存储(密文) + 绑定设备指纹/IP风控‌采用国密SM4或AES-GCM加密,结合盐值(Salt)防彩虹表攻击‌
地址非敏感场景可明文存储;涉及风控时加密‌按业务需求选择:明文存储(地址库关联)或加密存储(如哈希+模糊匹配)‌
姓名加密存储(密文) + 脱敏展示(如“张*三”)‌与身份证号绑定加密,仅授权服务可解密‌

具体技术实现

  1. 使用硬件安全模块(HSM)‌:将加密密钥存储在硬件安全模块中,增加密钥管理的安全性。
  2. 采用强加密算法‌:如AES-256等强加密算法,确保数据在存储和传输过程中的安全性。
  3. 日志管理‌:敏感信息的操作日志应进行加密处理,防止通过日志获取敏感信息。
  4. 定期更新和审计‌:定期更新加密算法和密钥,并对存储的敏感信息进行定期审计,确保没有异常访问。

存储架构设计要点

  1. 数据库分层隔离

    • PCI合规区‌:存储银行卡号、CVV等PCI-DSS强管控字段,使用专用加密数据库(如Oracle TDE)或云厂商KMS服务‌。
    • 普通加密区‌:存储身份证号、手机号等字段,通过分库分表隔离敏感数据,禁止JOIN操作‌。
    • 日志脱敏区‌:日志中仅记录脱敏后的数据(如138‌****‌1234),禁止明文输出敏感字段‌。
  2. 密钥管理

    • 主密钥‌:由硬件加密机(HSM)生成和存储,禁止落盘‌。
    • 数据密钥‌:动态生成并加密存储,每次加密使用独立密钥,定期轮换‌。
  3. 访问控制

    • 权限隔离‌:敏感字段仅允许风控、支付核心服务访问,通过RBAC模型控制‌。
    • 审计追踪‌:记录所有敏感数据访问日志,支持操作溯源(如谁在何时解密了某银行卡号)‌。

安全增强措施

  1. 传输加密

    • 前端到服务端:强制HTTPS + TLS 1.3,敏感字段二次加密(如RSA非对称加密)‌。
    • 服务间通信:通过双向TLS(mTLS)或服务网格(如Istio)保障内网传输安全‌。
  2. 数据生命周期管理

    • 存储时效‌:临时数据(如验证码)设置短时TTL,持久化数据定期归档清理‌。
    • 备份加密‌:数据库备份文件需加密,且与生产环境密钥分离‌。
  3. 合规与审计

    • 符合PCI-DSS、GDPR、中国《个人信息保护法》要求,定期渗透测试与合规审计‌。
    • 敏感数据存储区域启用防火墙白名单策略,仅允许授权IP段访问‌。

法律和合规性

  1. 遵守相关法律法规‌:确保存储和处理敏感信息符合当地的隐私保护法律法规,如GDPR、CCPA等。
  2. 用户知情同意‌:在收集和处理敏感信息前,必须获得用户的明确同意,并在用户协议中明确告知信息收集的目的和使用方式。
  3. 数据最小化原则‌:只收集和处理必要的敏感信息,避免过度收集用户数据。
  4. 跨境数据传输合规‌:如果涉及跨境数据传输,需确保符合相关国家和地区的跨境数据传输规定。

实现示例(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_nameVARCHAR(50)存储姓氏明文(如"张"),不排除少数民族姓,可能长度超过50字符,根据实际情况可以做调整,一般汉族姓是1-2个字符(单姓、复姓)。
encrypted_full_nameCHAR(64)完整姓名SHA-256加密值(示例:对"张三"加密后的64位十六进制字符串)

实现逻辑‌:

// 示例代码:生成加密值
String fullName = "张三";
String encryptedName = DigestUtils.sha256Hex(fullName); // 使用commons-codec库

2. 手机号字段
字段名类型说明
operator_prefixCHAR(3)运营商代码(如移动: 139,联通: 186)
encrypted_phoneCHAR(64)11位手机号SHA-256加密值
phone_locationVARCHAR(20)归属地(如"浙江杭州")

数据示例‌:


phone = "13812345678"
operator_prefix = "138"
encrypted_phone =  DigestUtils.sha256Hex(phone)
phone_location = "北京" 

3. 身份证字段
字段名类型说明
id_card_prefixCHAR(6)地址码(如北京市东城区: 110101)
encrypted_id_cardCHAR(64)18位身份证SHA-256加密值

加密逻辑‌:

id_card = "31010419900520123X"
id_card_prefix = "310104"
encrypted_phone =  DigestUtils.sha256Hex(id_card)

4. 银行卡字段
字段名类型说明
bank_card_prefixCHAR(2)卡号前2位(如招商银行: 62)
encrypted_bank_card_binCHAR(64)前6位BIN码SHA-256加密值(如"622588")
encrypted_bank_card_fullCHAR(64)完整卡号SHA-256加密值

 加密逻辑‌:

中国农业银行 卡号:6223481828196117070

bank_card = "6223481828196117070"
bank_card_prefix = DigestUtils.sha256Hex("622348")
encrypted_phone =  DigestUtils.sha256Hex(bank_card )

注意要点‌:

  • BIN码加密可用于反查发卡行,但不暴露完整卡号
  • 完整卡号加密保证唯一性

5. 地址字段
字段名类型说明
region_codeCHAR(6)行政编码(如杭州市西湖区: 330106)
encrypted_full_addressCHAR(64)完整地址SHA-256加密值(如"浙江省杭州市西湖区文三路100号")

安全增强措施

  1. 加密算法选择‌:

    • 使用SHA2(str, 256)替代MD5等弱哈希算法
    • 建议应用层加密后存储,避免SQL日志泄露原文
  2. 访问控制‌:

    -- 禁止非授权用户访问加密字段
    CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword!';
    GRANT SELECT (id, first_name, phone_location) ON user_info TO 'app_user';
    
  3. 审计日志‌:

    -- 开启数据库审计(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);

设计亮点总结

  1. 分级存储‌:结合明文片段与哈希值,平衡业务需求与安全
  2. 哈希唯一性‌:通过SHA-256保证敏感数据不可逆且唯一
  3. 最小化存储‌:仅保留必要的明文片段(如运营商代码、行政编码)
  4. 合规性‌:符合《个人信息保护法》关于敏感信息存储的要求
  5. 可追溯性‌:通过时间戳字段记录数据变更历史

中国手机号码编码规则解析

一、号码结构与编码逻辑

  1. 基础结构:中国手机号码统一为‌11位‌,按功能划分为三部分:

    • 第8-11位‌:用户随机分配码(唯一性标识)‌
    • 第4-7位‌:地区编码(归属地标识)‌
    • 前3位‌:网络识别号(运营商代码)‌
    • 示例解析:以号码‌13912345678‌为例:

  • 139‌:中国移动号段‌
  • 1234‌:归属地编码(如北京“010”对应中间四位中的部分)‌
  • 5678‌:用户唯一码‌。
  • 通过上述规则,手机号码既能精准标识用户身份,又兼顾运营商管理与国际兼容性‌。
  1. 国际规范适配:遵循国际电信联盟(ITU)‌E.164标准‌,总长度含国家代码(中国为“86”)不超过15位‌。


二、运营商识别规则

  1. 主要运营商号段

    • 中国移动‌:134-139、147、150-152、157-159、188等‌
    • 中国联通‌:130-132、155-156、185-186等‌
    • 中国电信‌:133、149、153、173、177-181、189等‌
    • 虚拟运营商‌:以170、171、167等号段为主‌。
  2. 特殊号段功能:物联网(M2M)‌:以144、146等开头,专用于智能设备联网‌。


三、地区编码与归属地划分

  1. 编码规则

    • 第4-7位‌对应用户注册时的行政区域,如“020”代表广州,“021”代表上海‌。
    • 携号转网‌支持后,归属地可能与实际使用地分离‌。
  2. 查询方式:可通过‌工信部备案平台‌、运营商APP或第三方工具(如支付宝“一证通查”)验证归属地‌。


四、号码位数演变与容量设计

  1. 历史背景

    • 早期为‌10位‌(如1990年代),后因用户量激增至‌11位‌(2000年后)‌。
    • 11位组合容量达‌千亿级‌,满足长期需求(如每人多号码分配)‌。
  2. 号段扩展:新增号段如“15”“16”“17”等,进一步扩充资源池‌。


五、特殊用途号码

  1. 服务类号码

    • 短号‌:如“10086”(移动客服)、“12306”(铁路服务)‌
    • 紧急号码‌:110、120、119等以“1”开头,与普通手机号区分‌。
  2. 未来发展趋势

    • 智能号码‌:结合AI技术实现个性化服务‌
    • 全球统一规范‌:适应跨国通信需求‌。

银行卡卡号规则

银行卡号规则是银行系统的重要编码标准,理解其结构有助于快速识别卡片来源、避免换卡时的业务中断,并增强用卡安全性。

一、银行卡号的基本结构‌

  1. 位数范围
    银行卡号长度一般为16-19位,部分国际卡可能为12-19位。国内银联标准卡多为16-19位,双组织卡(如Visa+银联)可能为13-19位。

  2. 组成部分

    • 前6位‌:发行者标识代码(IIN/BIN),用于标识发卡银行、卡组织及卡片级别。例如,中国银联卡以62开头,Visa卡以4开头,万事达卡以51-55开头。
    • 中间位数‌(第7至倒数第2位):发卡行自定义位,通常包含账户类型、发卡地区等信息,长度一般为6-12位。
    • 最后1位‌:校验码,通过Luhn算法计算,用于验证卡号合法性。

二、关键编码规则

  1. 发卡行标识代码(IIN/BIN)

    • ​第一位数字为主要产业标识符(MII),代表行业分类(如4/5为金融财务,62为中国银联)。
    • 前6位可细分银行及卡种。例如,农行普卡以622848开头,金卡以622845开头。
  2. 银联卡的特殊性

    • 国内银联卡主要分为三类:
      • 62开头‌:符合国际标准的银联标准卡,可在境外使用。
      • 60开头‌:早期国际标准卡,逐步被62替代。
      • 9开头‌:仅限国内使用的旧版卡,已逐步淘汰。
      • 4开头‌:信用卡。
  3. 校验码计算
    最后一位通过Luhn算法生成,用于防止输入错误或伪造。例如,对前15位数字进行加权求和后取模运算。

三、实际应用与注意事项

  1. 换卡保号规则

    • 62开头的银联借记卡到期后,可通过手机银行或网点申请“同号换卡”,但需提前2个月操作。
    • 信用卡通常默认不换号,仅更新安全码和有效期。
  2. 卡号识别技巧

    • 通过前6位可快速判断发卡行及卡种。例如,建行借记卡常见以622700开头。
    • 部分银行在自定义位中包含分行代码(如农行第4-5位后4位为地区编号)。

身份证规则

规则依据《中华人民共和国居民身份证法》及相关政策制定,确保公民身份信息的准确性和安全性。

身份证号规则

oracle验证公民身份号码_oracle校验表中身份证号码-CSDN博客

中国居民身份证号码采用18位编码规则,由地址码、出生日期码、顺序码和校验码四部分组成,具体规则如下:

一、编码结构分解

  1. 地址码(前6位)

    • 第1-2位‌:省级行政区代码(如31代表上海)‌。
    • 第3-4位‌:地级市代码(如3101为上海市辖区)‌。
    • 第5-6位‌:区县代码(如310104为上海市徐汇区)‌。
    • 地址码依据国家统计局行政区划代码编制,行政区调整可能导致同一地区代码不同‌37。
  2. 出生日期码(第7-14位)

    • 格式为YYYYMMDD,如19900520表示1990年5月20日出生‌。
  3. 顺序码(第15-17位)

    • 同一地址码区域内,对同年同月同日出生者按登记顺序分配,第17位为性别标识:‌奇数代表男性,偶数代表女性‌‌。
  4. 校验码(第18位)

    • 通过前17位加权求和并取模计算得出,范围为0-10。若结果为10,则用罗马数字X代替,以保证总长度为18位‌。

二、特殊规则说明

  • 大区划分‌:第1位数字对应解放初期的6大行政区(1-华北,2-东北,3-华东,4-中南,5-西南,6-西北),第2位细化省级单位(如11北京、12天津)‌。
  • 终身唯一性‌:身份证号码自首次登记后终身不变‌。
  • 校验码作用‌:用于验证号码有效性,防止输入或传输错误,如银行、政务系统中自动校验‌。

三、示例解析

31010419900520123X为例:

  • 310104‌:上海市徐汇区‌。
  • 19900520‌:1990年5月20日出生‌。
  • 123‌:当日第123位登记,第17位“3”(奇数)为男性‌。
  • X‌:校验码计算结果为10‌。

身份证有效期规则

根据《中华人民共和国居民身份证法》及相关规定,身份证的有效期规则如下:‌

  1. 十六周岁至二十五周岁‌:身份证有效期为十年。
  2. 二十六周岁至四十五周岁‌:身份证有效期为二十年。
  3. 四十六周岁以上‌:身份证长期有效。
  4. 未满十六周岁‌:自愿申请领取身份证的,有效期为五年。

一、身份证申领与换领规则

  1. 申领时间‌:公民应自年满十六周岁之日起三个月内,向常住户口所在地的公安机关申请领取身份证。
  2. 换领情形‌:身份证有效期满、姓名变更、证件严重损坏或登记项目出现错误时,需申请换领新证。
  3. 补领情形‌:身份证丢失的,应申请补领。

二、身份证使用与查验规则

  1. 使用范围‌:身份证用于证明身份,包括常住户口登记项目变更、兵役登记、婚姻登记、申请办理出境手续等。
  2. 查验情形‌:人民警察依法执行职务时,可查验身份证,例如对有违法犯罪嫌疑的人员查明身份等。

三、其他重要规则

  1. 指纹信息‌:公民申请领取、换领、补领身份证时,需登记指纹信息。
  2. 临时身份证‌:在申请领取、换领、补领身份证期间,急需使用身份证的,可申请临时身份证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01Byte空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值