---
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-业务讲解-用户私密信息如何脱敏展示]]