--- title: "09-业务讲解-用户私密信息如何加密存储" created: 2025-12-12 aliases: - 业务讲解-用户私密信息如何加密存储 tags: - 项目 --- # 业务讲解-用户私密信息如何加密存储 数据库加密是计算机系统对信息进行保护的一种最可靠的方法。它利用密码技术对信息进行加密,实现信息屏蔽,从而起到保护信息安全的作用。对数据库中的数据进行加密,可以防止数据在存储和传输过程中失密 数据库加密技术属于主动防御机制,可以防止明文存储引起的数据泄密、突破边界防护的外部黑客攻击以及来自内部高权限用户的数据窃取,从根本上解决数据库敏感数据泄漏问题 ## 数据库加密存储过程的重要性 数据库中存储的数据往往具有很高的敏感度,例如用户的密码、个人隐私信息等等。如果数据库的管理员不能保证数据的安全,将会给用户和企业带来不可估量的损失。因此,对数据库中的数据进行加密存储是至关重要的 ### 哪些信息要加密存储 虽然理论上所有存储在数据库中的数据都应该被加密,但是出于性能和实用性的考虑,通常会优先加密以下类型的信息: 1. 个人身份信息(PII):如姓名、地址、社会保险号、驾驶执照号等 2. 财务信息:包括银行账户信息、信用卡号、交易记录等 3. 健康信息:如病历记录、治疗信息、健康保险信息等,特别是在遵守HIPAA等法规的环境中 4. 商业秘密和知识产权:如未公开的财务数据、策略计划、专利申请资料等 5. 登录凭证:如密码、密钥、令牌等,这些信息若被泄露可能直接导致未授权访问 ### 常见的数据库加密方式 在数据库中,常见的加密方式包括: 1. 对称加密:使用相同密钥的加密算法,加密速度快,但密钥不易管理 2. 非对称加密:使用公钥和私钥的加密算法,安全性高,但加密速度较慢 3. 哈希加密:将原始数据通过哈希函数转换成固定长度的字符串,不可逆,但容易遭受字典攻击 ### 加密存储过程的实现步骤 对于数据库中敏感的数据,可以通过以下步骤进行加密存储过程的实现: 1. 将原始数据进行加密处理 2. 生成加密后的数据并存储到数据库中 3. 当需要查询原始数据时,在查询语句中对数据进行解密处理 ### 需要注意的问题 在使用加密存储过程时,需要注意以下问题: 1. 要保证加密算法的安全性,不能选择容易被破解的加密算法 2. 要合理地使用加密算法,避免加密后的数据长度过长,影响数据库的性能 3. 要对密钥进行管理,保证密钥的安全性 4. 要进行数据备份,防止因为加密算法或密钥丢失而导致的数据无法恢复的情况 ### 项目中的加密技术选型 在大麦网中需要加密的私密信息有用户手机号、购票人证件号,下面来介绍是如何将这些信息进行加密存储的 由于大麦网使用了ShardingSphere来实现分库分表,而且ShardingSphere提供了数据加密存储的功能,所以直接按照ShardingSphere的加密规则来配置 [ShardingSphere加密配置说明](https://shardingsphere.apache.org/document/5.3.2/cn/user-manual/shardingsphere-jdbc/yaml-config/rules/encrypt) ShardingSphere加密后的使用限制 1. 需自行处理数据库中原始的存量数据; 2. 模糊查询支持 %、\_,暂不支持 escape; 3. 加密字段无法支持查询不区分大小写功能; 4. 加密字段无法支持比较操作,如:大于、小于、ORDER BY、BETWEEN 等; 5. 加密字段无法支持计算操作,如:AVG、SUM 以及计算表达式。 ShardingSphere加密过程 [数据加密](https://shardingsphere.apache.org/document/5.3.2/cn/reference/encrypt/) 项目实际加密流程 引入 ShardingSphere 的相关依赖 ```xml 5.3.2 org.apache.shardingsphere shardingsphere-jdbc-core ${shardingsphere.version} logback-classic ch.qos.logback ``` 用户项目相关配置: ```yaml spring: datasource: driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver url: jdbc:shardingsphere:classpath:shardingsphere-user.yaml ``` shardingsphere-user.yaml配置: ```yaml rules: # 加密规则 - !ENCRYPT tables: # d_user表 d_user: columns: # 对mobile列进行加密 mobile: # 密文列mobile cipherColumn: mobile # 自定义的加密算法 encryptorName: user_encryption_algorithm # 对password列进行加密 password: # 密文列password cipherColumn: password # 自定义的加密算法 encryptorName: user_encryption_algorithm # 对id_number列进行加密 id_number: # 密文列id_number cipherColumn: id_number # 自定义的加密算法 encryptorName: user_encryption_algorithm # d_user_mobile表 d_user_mobile: columns: # 对mobile列进行加密 mobile: # 密文列id_number cipherColumn: mobile # 自定义的加密算法 encryptorName: user_encryption_algorithm # d_ticket_user表 d_ticket_user: columns: # 对id_number列进行加密 id_number: # 密文列id_number cipherColumn: id_number # 自定义的加密算法 encryptorName: user_encryption_algorithm encryptors: # 使用SM4算法 user_encryption_algorithm: type: SM4 props: sm4-key: d3ecdaa11d6ab89e1987870186073eaa sm4-mode: CBC sm4-iv: 1afc7fdce9ebc393f693cd3d23e35ed2 sm4-padding: PKCS7Padding props: # 打印真实sql sql-show: true ``` SM4 加密算法属性说明 | | | | | --- | --- | --- | | 名称 | 数据类型 | 说明 | | sm4-key | String | SM4使用的KEY(16 Bytes) | | sm4-mode | String | SM4使用的MODE(CBC或 ECB) | | sm4-iv | String | SM4使用的IV(MODE为CBC 时需指定,16Bytes) | | sm4-padding | String | SM4使用的 PADDING (PKCS5Padding或 PKCS7Padding,暂不支持 NoPadding) | 其他算法详细说明 [加密算法](https://shardingsphere.apache.org/document/5.3.2/cn/user-manual/common-config/builtin-algorithm/encrypt/) 数据库中的存储 ```json { "id": 8473985524573986816, "user_id": 8408725077058789376, "rel_name": "李四", "id_type": 1, "id_number": "52354f555124cda6b5b3f92fc38bdc4c094ead534bdb0f93972a21e978743fb3", "create_time": "2024-03-13 11:09:38", "edit_time": "2024-03-13 11:09:38", "status": 1 } ``` ShardingSphere 在插入数据时,会将明文通过配置的加密算法进行加密成密文,然后存储到数据库中 在进行查询相关语句时,会先将库中的密文数据转换为明文数据,然后展示出来 ![[image-259770d5.png]] 核心机制:增删改的加密列数据自动转换成密文,select后查询的加密列自动转换成明文 1.通过解析器的词法分析,语法分析,构建语法树 2.整个分片表名替换&加密列改写流程,都是在解析出来的AST(抽象语法树)进行3.分片键==加密字段时就先对Value加密再进行分片算法 4.用SM4-CBC+固定IV,所以同一个手机号每次都会得到同一个密文, 1 "1380013800e" → SM4\_CBC(key, 固定IV) → "ABCD.==" 在大麦项目里,我们既要在数据库里对敏感列(如手机号)加密存储,同时还要基于手机号分片,或者做索引查询。如果加密本身是随机的: ·随机IV-同一手机号每次加密出不同密文 ·分片路由 或WHEREmobile=?查询 无法用密文匹配! 我们需要“确定性加密”:同一明文对应同一密文,这样分片算法、数据库索引I、哈希取模全都能正常工作。 --- **企业级项目导航**:⬅️ [[08-业务讲解-用户登录和退出流程解析|08-业务讲解-用户登录和退出流程解析]] | 09-业务讲解-用户私密信息如何加密存储 | ➡️ [[10-业务讲解-用户私密信息如何脱敏展示|10-业务讲解-用户私密信息如何脱敏展示]]