Skip to content

业务讲解-用户私密信息如何加密存储

数据库加密是计算机系统对信息进行保护的一种最可靠的方法。它利用密码技术对信息进行加密,实现信息屏蔽,从而起到保护信息安全的作用。对数据库中的数据进行加密,可以防止数据在存储和传输过程中失密

数据库加密技术属于主动防御机制,可以防止明文存储引起的数据泄密、突破边界防护的外部黑客攻击以及来自内部高权限用户的数据窃取,从根本上解决数据库敏感数据泄漏问题

数据库加密存储过程的重要性

数据库中存储的数据往往具有很高的敏感度,例如用户的密码、个人隐私信息等等。如果数据库的管理员不能保证数据的安全,将会给用户和企业带来不可估量的损失。因此,对数据库中的数据进行加密存储是至关重要的

哪些信息要加密存储

虽然理论上所有存储在数据库中的数据都应该被加密,但是出于性能和实用性的考虑,通常会优先加密以下类型的信息:

**1. 个人身份信息(PII):**如姓名、地址、社会保险号、驾驶执照号等

**2. 财务信息:**包括银行账户信息、信用卡号、交易记录等

**3. 健康信息:**如病历记录、治疗信息、健康保险信息等,特别是在遵守HIPAA等法规的环境中

**4. 商业秘密和知识产权:**如未公开的财务数据、策略计划、专利申请资料等

**5. 登录凭证:**如密码、密钥、令牌等,这些信息若被泄露可能直接导致未授权访问

常见的数据库加密方式

在数据库中,常见的加密方式包括:

  1. 对称加密:使用相同密钥的加密算法,加密速度快,但密钥不易管理
  2. 非对称加密:使用公钥和私钥的加密算法,安全性高,但加密速度较慢
  3. 哈希加密:将原始数据通过哈希函数转换成固定长度的字符串,不可逆,但容易遭受字典攻击

加密存储过程的实现步骤

对于数据库中敏感的数据,可以通过以下步骤进行加密存储过程的实现:

  1. 将原始数据进行加密处理
  2. 生成加密后的数据并存储到数据库中
  3. 当需要查询原始数据时,在查询语句中对数据进行解密处理

需要注意的问题

在使用加密存储过程时,需要注意以下问题:

  • 要保证加密算法的安全性,不能选择容易被破解的加密算法
  • 要合理地使用加密算法,避免加密后的数据长度过长,影响数据库的性能
  • 要对密钥进行管理,保证密钥的安全性
  • 要进行数据备份,防止因为加密算法或密钥丢失而导致的数据无法恢复的情况

项目中的加密技术选型

在大麦网中需要加密的私密信息有用户手机号、购票人证件号,下面来介绍是如何将这些信息进行加密存储的

由于大麦网使用了ShardingSphere来实现分库分表,而且ShardingSphere提供了数据加密存储的功能,所以直接按照ShardingSphere的加密规则来配置

ShardingSphere加密配置说明

数据加密 :: ShardingSphere

ShardingSphere加密后的使用限制

  • 需自行处理数据库中原始的存量数据;
  • 模糊查询支持 %、_,暂不支持 escape;
  • 加密字段无法支持查询不区分大小写功能;
  • 加密字段无法支持比较操作,如:大于、小于、ORDER BY、BETWEEN 等;
  • 加密字段无法支持计算操作,如:AVG、SUM 以及计算表达式。

ShardingSphere加密过程

数据加密 :: ShardingSphere

项目实际加密流程

引入 ShardingSphere 的相关依赖

xml
<properties>
	<shardingsphere.version>5.3.2</shardingsphere.version>
</properties>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>${shardingsphere.version}</version>
    <exclusions>
        <exclusion>
            <artifactId>logback-classic</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
    </exclusions>
</dependency>

用户项目相关配置:

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-keyStringSM4 使用的 KEY (16 Bytes)
sm4-modeStringSM4 使用的 MODE (CBC 或 ECB)
sm4-ivStringSM4 使用的 IV (MODE 为 CBC 时需指定,16 Bytes)
sm4-paddingStringSM4 使用的 PADDING (PKCS5Padding 或 PKCS7Padding,暂不支持 NoPadding)

其他算法详细说明

加密算法 :: ShardingSphere

数据库中的存储

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 在插入数据时,会将明文通过配置的加密算法进行加密成密文,然后存储到数据库中

在进行查询相关语句时,会先将库中的密文数据转换为明文数据,然后展示出来

更新: 2025-10-13 11:38:29
原文: https://www.yuque.com/u22210564/ykdrdh/dnmakdgtfg65ntcf

Java 后端面试知识库