Skip to content

DM 数据加密

加密类型

1. 存储加密

定义:对数据库存储在磁盘上的数据进行加密,包括数据文件、日志文件、备份文件等。

特点

  • 透明加密,对应用程序透明,无需修改应用代码
  • 加密强度高,支持多种加密算法
  • 可以防止物理存储设备丢失导致的数据泄露

适用场景

  • 存储敏感数据的数据库
  • 对数据安全要求高的场景
  • 符合合规要求的场景,如 GDPR、PCI DSS 等

加密对象

  • 数据文件(.DBF)
  • 日志文件(.LOG)
  • 备份文件(.BAK)
  • 归档日志文件(.ARC)

2. 传输加密

定义:对客户端与数据库之间传输的数据进行加密,防止网络监听和数据篡改。

特点

  • 支持 SSL/TLS 协议
  • 可以防止中间人攻击
  • 对应用程序影响小,只需修改连接配置

适用场景

  • 客户端与数据库之间通过公网连接
  • 对数据传输安全要求高的场景
  • 符合合规要求的场景

加密协议

  • SSL 3.0
  • TLS 1.0/1.1/1.2/1.3

3. 应用加密

定义:在应用程序层面对数据进行加密,包括数据的加密存储和加密传输。

特点

  • 灵活性高,可以根据业务需求选择加密算法和策略
  • 可以实现更细粒度的加密控制
  • 需要修改应用程序代码

适用场景

  • 对特定字段或数据类型进行加密
  • 需要实现端到端加密的场景
  • 对加密有特殊要求的场景

加密方式

  • 字段级加密
  • 行级加密
  • 应用层加密库

存储加密配置

1. 加密算法

DM 数据库支持多种加密算法,包括:

算法类型支持的算法密钥长度适用场景
对称加密AES128、AES192、AES256128/192/256 位数据文件加密、日志文件加密
非对称加密RSA1024、RSA2048、RSA40961024/2048/4096 位密钥加密、数字签名
哈希算法SHA1、SHA256、SHA512-数据完整性验证、密码哈希

2. 加密配置步骤

操作说明

  • 配置数据库加密参数
  • 初始化加密环境
  • 创建加密表空间或加密表

配置文件修改

  1. 修改 dm.ini 配置文件,启用加密功能:
ini
# 启用数据加密功能
ENABLE_ENCRYPT = 1

# 加密算法,可选值:AES128、AES192、AES256
ENCRYPT_NAME = AES256

# 加密密钥存储方式,可选值:FILE、HSM
ENCRYPT_KEY_STORE = FILE

# 密钥文件路径
ENCRYPT_KEY_FILE = /dm/data/DAMENG/encrypt.key
  1. 初始化加密环境:
bash
# 使用 dmenskmgr 工具初始化加密环境
./dmenskmgr init -path /dm/data/DAMENG/encrypt.key -pwd Dameng123
  1. 创建加密表空间:
sql
-- 创建加密表空间
CREATE TABLESPACE encrypt_ts DATAFILE 'encrypt_ts.dbf' SIZE 100M ENCRYPT WITH AES256;
  1. 创建加密表:
sql
-- 在加密表空间上创建表
CREATE TABLE encrypt_table (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    sensitive_data VARCHAR(100)
) TABLESPACE encrypt_ts;

-- 在普通表空间上创建加密表
CREATE TABLE encrypt_table2 (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    sensitive_data VARCHAR(100) ENCRYPT WITH AES256
) TABLESPACE main;

3. 加密密钥管理

操作说明

  • 生成和管理加密密钥
  • 定期轮换加密密钥
  • 备份和恢复加密密钥

密钥管理工具

dmenskmgr 工具

  • 功能:达梦数据库加密密钥管理工具,用于生成、备份、恢复和轮换密钥
  • 常用命令
    bash
    # 初始化密钥文件
    ./dmenskmgr init -path /dm/data/DAMENG/encrypt.key -pwd Dameng123
    
    # 备份密钥文件
    ./dmenskmgr backup -path /dm/data/DAMENG/encrypt.key -bak_path /dm/backup/encrypt.key.bak -pwd Dameng123
    
    # 恢复密钥文件
    ./dmenskmgr restore -path /dm/data/DAMENG/encrypt.key -bak_path /dm/backup/encrypt.key.bak -pwd Dameng123
    
    # 轮换密钥
    ./dmenskmgr rotate -path /dm/data/DAMENG/encrypt.key -pwd Dameng123
    
    # 查看密钥信息
    ./dmenskmgr info -path /dm/data/DAMENG/encrypt.key -pwd Dameng123

密钥管理最佳实践

  • 使用强密码保护密钥文件
  • 定期轮换密钥,建议每 6-12 个月轮换一次
  • 备份密钥文件并存储在安全可靠的位置
  • 限制密钥文件的访问权限,只有数据库管理员可以访问
  • 考虑使用硬件安全模块(HSM)存储密钥,提高密钥安全性

传输加密配置

1. SSL/TLS 配置步骤

操作说明

  • 生成 SSL 证书和密钥
  • 配置数据库 SSL 参数
  • 配置客户端 SSL 连接

证书生成

bash
# 使用 OpenSSL 生成 CA 证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

# 生成服务器证书请求
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr

# 签署服务器证书
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

# 生成客户端证书请求
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr

# 签署客户端证书
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt

数据库配置

  1. 修改 dm.ini 配置文件,启用 SSL 功能:
ini
# 启用 SSL 功能
ENABLE_SSL = 1

# SSL 协议版本,可选值:TLS1.0、TLS1.1、TLS1.2、TLS1.3
SSL_VERSION = TLS1.2

# 服务器证书文件路径
SSL_SERVER_CERT = /dm/data/DAMENG/server.crt

# 服务器私钥文件路径
SSL_SERVER_KEY = /dm/data/DAMENG/server.key

# CA 证书文件路径
SSL_CA_CERT = /dm/data/DAMENG/ca.crt
  1. 修改 dm.ini 配置文件,配置 SSL 端口:
ini
# SSL 服务端口
SSL_PORT_NUM = 5237

客户端配置

  1. 在客户端配置文件中添加 SSL 配置:
ini
# 启用 SSL 连接
SSL_ENABLE = 1

# SSL 协议版本
SSL_VERSION = TLS1.2

# 客户端证书文件路径
SSL_CLIENT_CERT = /dm/client/client.crt

# 客户端私钥文件路径
SSL_CLIENT_KEY = /dm/client/client.key

# CA 证书文件路径
SSL_CA_CERT = /dm/client/ca.crt
  1. 使用 SSL 连接数据库:
bash
# 使用 disql 工具通过 SSL 连接数据库
disql SYSDBA/SYSDBA@localhost:5237?ssl=true

2. SSL 连接验证

操作说明

  • 验证 SSL 连接是否成功
  • 检查 SSL 连接的加密强度

验证方法

  1. 使用 disql 工具连接数据库,查看连接信息:
sql
-- 查看数据库连接信息
SELECT * FROM V$SESSION WHERE SID = SYS_CONTEXT('USERENV', 'SID');
  1. 使用 OpenSSL 工具验证 SSL 连接:
bash
# 验证 SSL 连接
openssl s_client -connect localhost:5237 -CAfile /dm/client/ca.crt

应用加密

1. 字段级加密

定义:对表中的特定字段进行加密,只有授权用户才能查看解密后的数据。

操作说明

  • 创建加密函数和解密函数
  • 在表定义中指定加密字段
  • 使用加密函数插入数据,使用解密函数查询数据

示例

sql
-- 创建加密函数
CREATE OR REPLACE FUNCTION encrypt_data(p_data VARCHAR(100)) RETURN VARCHAR(200)
AS
    v_result VARCHAR(200);
BEGIN
    v_result := ENCRYPT(p_data, 'AES256', 'Dameng123');
    RETURN v_result;
END;
/

-- 创建解密函数
CREATE OR REPLACE FUNCTION decrypt_data(p_data VARCHAR(200)) RETURN VARCHAR(100)
AS
    v_result VARCHAR(100);
BEGIN
    v_result := DECRYPT(p_data, 'AES256', 'Dameng123');
    RETURN v_result;
END;
/

-- 创建包含加密字段的表
CREATE TABLE user_info (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    phone VARCHAR(200),
    email VARCHAR(200)
);

-- 插入加密数据
INSERT INTO user_info VALUES (1, '张三', encrypt_data('13800138000'), encrypt_data('zhangsan@example.com'));

-- 查询解密数据
SELECT id, name, decrypt_data(phone) AS phone, decrypt_data(email) AS email FROM user_info;

2. 透明数据加密(TDE)

定义:对表中的敏感字段进行透明加密,应用程序无需修改代码即可使用。

操作说明

  • 配置透明数据加密参数
  • 创建透明加密表

示例

sql
-- 创建透明加密表
CREATE TABLE tde_table (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    sensitive_data VARCHAR(100) ENCRYPT WITH AES256
);

-- 插入数据(自动加密)
INSERT INTO tde_table VALUES (1, '张三', '敏感数据');

-- 查询数据(自动解密)
SELECT * FROM tde_table;

加密性能影响

1. 存储加密性能影响

影响因素

  • 加密算法的复杂度
  • 加密数据量的大小
  • 硬件配置(CPU、内存、存储)

性能优化建议

  • 选择合适的加密算法,平衡安全性和性能
  • 使用高性能存储设备,如 SSD
  • 增加 CPU 资源,提高加密和解密速度
  • 只对敏感数据进行加密,避免不必要的性能开销

2. 传输加密性能影响

影响因素

  • SSL/TLS 协议版本
  • 加密算法的复杂度
  • 网络带宽和延迟

性能优化建议

  • 使用较新的 TLS 版本,如 TLS 1.3
  • 选择合适的加密套件,平衡安全性和性能
  • 优化网络配置,提高网络带宽和降低延迟
  • 对频繁访问的数据考虑使用缓存,减少网络传输

加密数据的备份与恢复

1. 加密数据备份

操作说明

  • 备份加密数据库或加密表空间
  • 备份加密密钥
  • 记录加密配置参数

备份命令示例

bash
# 备份加密数据库
./dmrman CTLSTMT="BACKUP DATABASE '/dm/data/DAMENG/dm.ini' FULL TO 'encrypt_backup' BACKUPSET '/dm/backup/encrypt_backup'"

# 备份加密密钥
cp /dm/data/DAMENG/encrypt.key /dm/backup/encrypt.key.bak

2. 加密数据恢复

操作说明

  • 恢复加密数据库或加密表空间
  • 恢复加密密钥
  • 配置加密参数

恢复命令示例

bash
# 恢复加密密钥
cp /dm/backup/encrypt.key.bak /dm/data/DAMENG/encrypt.key

# 恢复加密数据库
./dmrman CTLSTMT="RESTORE DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/backup/encrypt_backup'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/backup/encrypt_backup'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' UPDATE DB_MAGIC"

加密最佳实践

1. 选择合适的加密策略

  • 根据业务需求和安全要求选择合适的加密类型
  • 对敏感数据进行加密,避免不必要的性能开销
  • 平衡安全性和性能,选择合适的加密算法

2. 加强密钥管理

  • 使用强密码保护密钥文件
  • 定期轮换加密密钥
  • 备份密钥文件并存储在安全可靠的位置
  • 考虑使用硬件安全模块(HSM)存储密钥

3. 定期审计和监控

  • 审计加密相关的操作,如密钥生成、轮换、备份等
  • 监控加密性能,及时调整加密策略
  • 定期检查加密配置,确保符合安全要求

4. 符合合规要求

  • 了解相关的合规要求,如 GDPR、PCI DSS 等
  • 根据合规要求配置加密功能
  • 定期进行合规审计,确保符合要求

5. 测试和验证

  • 在测试环境中测试加密功能,验证加密效果和性能影响
  • 定期进行加密数据的恢复测试,确保备份的可用性
  • 测试加密功能对应用程序的影响,确保应用程序正常运行

加密的版本差异

DM 版本加密功能特点
DM 7支持基本的存储加密和传输加密功能
DM 8增强了加密功能,支持透明数据加密(TDE)和更丰富的加密算法
DM 8.1支持硬件安全模块(HSM)集成,增强了密钥管理功能

常见问题(FAQ)

Q1: 加密会影响数据库性能吗?

A1: 加密会对数据库性能产生一定的影响,具体影响程度取决于加密类型、加密算法、硬件配置等因素。一般来说,存储加密的性能影响在 5%-15% 之间,传输加密的性能影响在 3%-10% 之间。可以通过选择合适的加密算法、优化硬件配置等方式降低性能影响。

Q2: 如何备份和恢复加密密钥?

A2: 备份和恢复加密密钥的方法如下:

  • 使用 dmenskmgr 工具备份和恢复密钥
  • 定期将密钥文件复制到安全的备份位置
  • 恢复时,将备份的密钥文件复制到原位置

Q3: 密钥丢失了怎么办?

A3: 密钥丢失会导致无法访问加密数据,因此必须妥善保管密钥。如果密钥丢失,可能需要重新创建数据库并恢复数据,但加密数据将无法恢复。因此,建议定期备份密钥,并将备份存储在安全可靠的位置。

Q4: 如何选择合适的加密算法?

A4: 选择合适的加密算法需要考虑安全性和性能的平衡:

  • 对于安全性要求高的场景,建议使用 AES256 等强加密算法
  • 对于性能要求高的场景,可以考虑使用 AES128 等相对轻量级的加密算法
  • 遵循相关的安全标准和合规要求

Q5: 透明数据加密(TDE)和字段级加密有什么区别?

A5: 透明数据加密(TDE)和字段级加密的主要区别在于:

  • TDE 对应用程序透明,无需修改代码;字段级加密需要修改应用程序代码
  • TDE 对整个表或表空间进行加密;字段级加密只对特定字段进行加密
  • TDE 的性能影响相对较大;字段级加密的性能影响相对较小
  • TDE 适用于对整个表或表空间的敏感数据进行加密;字段级加密适用于对特定字段的敏感数据进行加密

在实际应用中,应根据业务需求和安全要求选择合适的加密策略,平衡安全性和性能,确保加密功能的有效实施和管理。