▶ 占位符:<…> 表示需按实际环境替换的值(如密码、IP、路径、用户名)。
▶ 环境约定:DM_HOME=D:\dmdbms(DM8 Windows 安装目录),数据目录 D:\dmdata;示例端口 5236/5237。
▶ 两条路线:
路线 A(推荐):新建“国密测试”专用实例,可做全库加密,不破坏现有环境,可随时删除重建;
路线 B:在已有实例上加固,全库加密在建库时才能指定,改用表空间/列加密。
▶ 执行身份:修改 INI 参数用 SYSDBA;开启审计/加审计规则用 SYSAUDITOR(DBA 权限无法开启审计)。
▶ 涉及 INI 参数的修改,除注明动态外,均为静态参数,需重启服务生效。
1.1 安装 DM8(Windows 版)至 D:\dmdbms,完成默认实例初始化。
1.2 确认 OPENSSL 国密算法动态库就绪:检查 D:\dmdbms\bin\dependencies 下存在 libcrypto-3-x64.dll、libssl-3-x64.dll。
1.3 确认国密算法已注册(首次连接后执行):
disql SYSDBA/<密码>@localhost:5236
SELECT * FROM V$EXTERNAL_CIPHERS;
-- 期望结果:OPENSSL_SM4_ECB/CBC/CFB/OFB、OPENSSL_SM4_ECB_NOPAD/CBC_NOPAD/CFB_V1/OFB_V1、OPENSSL_SM3,VALID 均为 Y
1.4 禁止 DM 以管理员权限运行(对应加固说明 2.1;原 Linux 命令 groupadd/useradd 不适用于 Windows):
· 在 Windows 中为 DM 服务创建专用低权限账户(控制面板→管理工具→服务→DM 服务→登录→此账户),
· 并设置数据目录(D:\dmdata)NTFS 权限仅授予该账户与管理员,避免以 Administrator 身份运行数据库服务。
2.1 (可选)为避免与默认实例冲突,测试实例使用独立端口 5237。
2.2 初始化国密加密库(全库加密、日志加密、页分片):
cd D:\dmdbms\bin
dminit PATH=D:\dmdata\DMGM PAGE_SIZE=16 CASE_SENSITIVE=Y CHARSET=1 \
SYSDBA_PWD=<强口令> SYSAUDITOR_PWD=<强口令> \
ENCRYPT_NAME=OPENSSL_SM4_CBC RLOG_ENCRYPT_NAME=OPENSSL_SM4_CBC PAGE_ENC_SLICE_SIZE=4096
-- 参数含义:
-- ENCRYPT_NAME:全库加密算法(国密 SM4;已实测 OPENSSL_SM4_CBC 的 EXTEND_SIZE=16,满足全库加密限制,可用)
-- RLOG_ENCRYPT_NAME:联机日志/归档日志加密算法(国密 SM4)
-- PAGE_ENC_SLICE_SIZE:页加密分片大小,可选 0/512/4096 字节;注意:非0 时表空间加密仅支持 CFB_V1/OFB_V1
2.3 注册并启动服务(dminit 初始化成功后可自动注册服务 DmServiceDMGM):
net start DmServiceDMGM
2.4 验证全库加密已生效:
disql SYSDBA/<密码>@localhost:5237
SELECT SF_GET_ENCRYPT_NAME(); -- 期望返回 OPENSSL_SM4_CBC
SELECT SF_GET_PARA_VALUE(2,'RLOG_ENC_ID'); -- 日志加密算法 ID
注意:注:若走路线 B(已有实例),跳过本章,全库加密不可后补,改用第 6 章表空间/列加密。
3.1 密码强度策略(PWD_POLICY=31 = 禁止与用户名相同 1 + 长度≥9 的 2 + 大写 4 + 数字 8 + 标点 16):
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='PWD_POLICY'; -- 查看
ALTER SYSTEM SET 'PWD_POLICY'=31 BOTH; -- 修改(只对新用户生效)
-- 等价写法:SP_SET_PARA_VALUE(1,'PWD_POLICY',31);
3.2 密码过期策略(有效期 90 天、宽限期 30 天):
SELECT A.USERNAME, B.LIFE_TIME, B.GRACE_TIME FROM ALL_USERS A, SYSUSERS B WHERE A.USER_ID=B.ID; -- 查看
ALTER USER <用户名> LIMIT PASSWORD_LIFE_TIME 90, PASSWORD_GRACE_TIME 30;
3.3 创建最小权限业务账号(避免业务直连 SYSDBA):
CREATE USER app_user IDENTIFIED BY "<强口令>";
GRANT CREATE SESSION, CREATE TABLE TO app_user; -- 按业务最小授权
3.4 修改所有内置管理员默认口令(SYSDBA / SYSSSO / SYSAUDITOR 等),并遵守 PWD_POLICY 策略。
4.1 登录来源 IP 控制:
SELECT A.USERNAME, B.ALLOW_ADDR FROM ALL_USERS A, SYSUSERS B WHERE A.USER_ID=B.ID; -- 查看
ALTER USER "<用户名>" ALLOW_IP "<IP地址>"; -- 仅允许指定 IP 登录
4.2 登录失败处理(失败 3 次锁定 1 分钟、空闲 30 分钟断开):
SELECT A.USERNAME, B.FAILED_ATTEMPS, B.LOCK_TIME, B.CONN_IDLE_TIME FROM ALL_USERS A, SYSUSERS B WHERE A.USER_ID=B.ID; -- 查看
ALTER USER <用户名> LIMIT FAILED_LOGIN_ATTEMPS 3, PASSWORD_LOCK_TIME 1, CONNECT_IDLE_TIME 30;
5.1 应用层消息包加密(推荐首选:无需任何证书即可使用国密 SM4):
-- ① 确认可用算法(分组/流加密且非 NOPAD 模式)
SELECT CYT_NAME FROM V$CIPHERS WHERE (CYT_TYPE=1 OR CYT_TYPE=2) AND (WORK_MODE!='ECB_NOPAD' AND WORK_MODE!='CBC_NOPAD');
-- ② 修改参数(静态参数,需重启生效)
ALTER SYSTEM SET 'COMM_ENCRYPT_NAME'='OPENSSL_SM4_CBC' SPFILE;
-- ③ 重启服务
net stop DmServiceDMGM & net start DmServiceDMGM
-- ④ 验证
SELECT * FROM V$PARAMETER WHERE NAME='COMM_ENCRYPT_NAME'; -- 期望 OPENSSL_SM4_CBC
5.2 SSL / 商密 TLCP 通信加密(可选,需证书;ENABLE_ENCRYPT 为静态参数):
-- ENABLE_ENCRYPT 取值:0 不加密;1 双向认证+加密;2 仅认证;4 仅加密;5 单向认证+加密;6 商密 TLCP 认证加密
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',5); -- 测试推荐:SSL 单向认证+加密
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',6); -- 国密场景:商密 TLCP(需 SM2 签名/加密证书对)
SP_SET_PARA_VALUE(2,'MIN_SSL_VERSION',0x0303); -- 最低 TLSv1.2
-- 证书放置:服务器 D:\dmdbms\bin\server_ssl;客户端 D:\dmdbms\bin\client_ssl\<用户名>
-- TLCP 证书:server-enc.crt/server-enc.key/server-sign.crt/server-sign.key(服务器端)
-- 客户端带证书登录:
disql SYSDBA/<密码>@localhost:5237#"{ssl_path=D:\dmdbms\bin\client_ssl\SYSDBA,ssl_pwd=<证书密码>}"
-- 验证:
SELECT para_name, para_value FROM V$DM_INI WHERE para_name='ENABLE_ENCRYPT';
SELECT SESS_ID, USER_NAME, PORT_TYPE FROM V$SESSIONS; -- PORT_TYPE=7 表示国密 GmSSL 连接
6.1 表空间透明加密(路线 B 首选;已全库加密的库不能再做表空间加密)。
⚠ 重要:默认 PAGE_ENC_SLICE_SIZE=4096 时,表空间加密仅支持“不膨胀的流式算法”(EXTEND_SIZE=0 且非 ECB/CBC 模式),
实测 OPENSSL_SM4_CBC/ECB/CFB/OFB 的 EXTEND_SIZE=16 均不可用,只能选 OPENSSL_SM4_CFB_V1 或 OPENSSL_SM4_OFB_V1:
CREATE TABLESPACE GMTS DATAFILE 'D:\dmdata\DMGM\GMTS.DBF' SIZE 256 ENCRYPT WITH OPENSSL_SM4_CFB_V1 BY "<加密密码>";
CREATE TABLE T_ORD(ORD_ID INT, AMOUNT DEC(18,2)) TABLESPACE GMTS; -- 业务表放入加密表空间
6.2 表列透明加密(推荐对敏感列;新表建表时直接指定):
-- 新表列加密(身份证号 SM4 加密 + SM3 完整性校验)
CREATE TABLE T_USER(ID INT, NAME VARCHAR(50), CARD VARCHAR(18) ENCRYPT WITH OPENSSL_SM4_CBC HASH WITH OPENSSL_SM3 SALT);
-- 存量表:空表可直接 MODIFY 增加加密属性
ALTER TABLE T_USER MODIFY NAME VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC;
-- 存量表(已有数据):不能直接修改列加密,需新增加密列或建新加密表迁移
ALTER TABLE T_USER ADD CARD2 VARCHAR(18) ENCRYPT WITH OPENSSL_SM4_CBC; -- 新增加密列
-- 数据迁移示例:CREATE TABLE T_USER_NEW(...加密列...) AS SELECT ... FROM T_USER;
6.3 半透明加密(密评“多用户密文隔离”检测点;本机已实测验证通过)。
原理:数据用“用户存储加密密钥”加密,密文后附加用户 UID;仅数据归属用户(或按列加密可见列表内用户)查询返回明文,其他用户查得 NULL。
实施流程如下(每步给出操作与指令)。
【步骤①】创建带独立存储密钥的用户(前提;不指定 ENCRYPT BY 则 DM 自动生成默认存储密钥):
CREATE USER USER_A IDENTIFIED BY "User_A1!" ENCRYPT BY "Key_A1!"; -- 创建用户并指定独立存储密钥(存储密钥建议满足口令策略)
GRANT DBA TO USER_A; -- 授权(生产按最小权限原则授权)
ALTER USER <用户名> ENCRYPT BY "<新存储密钥>"; -- 存量用户补/换存储密钥(本机实测支持)
【步骤②】新建表的半透明加密(密评演示推荐做法;算法要求与列透明加密一致,NOPAD/EXTKEY 不可用):
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL); -- 半透明加密列(国密 SM4)
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL HASH WITH OPENSSL_SM3 SALT); -- 半透明 + SM3 完整性校验
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL USER (USER01,USER02)); -- 按列加密:仅可见列表用户可见明文
【步骤③】存量表改造(重要结论:半透明加密不能 MODIFY 把已有普通列改为加密列——本机实测报 [-2704] 不支持的 DDL;只能 ADD COLUMN 新增或建新表迁移):
ALTER TABLE T ADD C2_ENC VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL; -- 方式一:新增半透明加密列(老行该列为 NULL)
CREATE TABLE T_NEW(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL); -- 方式二:建新加密表迁移
INSERT INTO T_NEW SELECT C1, C2 FROM T; -- ⚠ 迁移数据归属权跟随执行会话用户:必须由最终数据归属用户执行
-- 迁移完成后按需清理原表;半透明加密列不支持 MODIFY 列定义、不支持 REBUILD COLUMNS
【步骤④】隔离效果验证(双用户,密评现场演示证据):
SELECT * FROM USER_A.T; -- 归属用户 A 查询:明文可见
SELECT * FROM USER_A.T; -- 非归属用户 B 查询同一表:加密列返回 NULL(非加密列仍可见)——密文隔离验证
UPDATE USER_A.T SET C2='X' WHERE C1=1; COMMIT; -- B 更新提交后归属权转移:B 可见、A 变 NULL;回滚则恢复原状
【步骤⑤】使用限制(易踩坑):HUGE 表不支持;半透明加密列不能建索引/外键/聚集索引、不能修改列定义、不支持 REBUILD COLUMNS;
物化视图查询不能涉及;ALTER_TABLE_OPT 限制;半透明字符串列默认不支持超长记录存储;按列加密可见列表缺省/为空时该列对所有用户不可见。
【步骤⑥】本机实测记录(2026-08-30):GM_SEMI_A/B 双用户验证 SM4_CBC+SM3 半透明表——B 查询加密列全 NULL;B 更新提交后 A 变 NULL、B 可见,与手册 UPDATE 规则一致;按列加密 USER 列表外用户查得 NULL;存量用户 ALTER USER ENCRYPT BY 成功;存量表 ADD COLUMN 成功、MODIFY 失败(-2704)——全部符合预期。
【步骤⑦】判断存量表是否为半透明表(官方系统表 SYSCOLCYT,本机实测验证):
SELECT O.NAME AS TBL, C.CID, C.ENC_ID, C.ENC_TYPE, C.HASH_ID, C.HASH_TYPE FROM SYSCOLCYT C, SYSOBJECTS O WHERE C.TID=O.ID AND O.TYPE$='SCHOBJ' AND C.ENC_TYPE='M'; -- 全库扫描半透明表(ENC_TYPE:'M'=半透明,'A'=透明)
SELECT C.TID, C.CID, C.ENC_ID, C.ENC_TYPE, C.HASH_ID, C.HASH_TYPE FROM SYSCOLCYT C WHERE C.TID=(SELECT ID FROM SYSOBJECTS WHERE NAME='表名'); -- 判断单表列加密信息
SELECT NAME, INFO2 FROM SYSCOLUMNS WHERE ID=(SELECT ID FROM SYSOBJECTS WHERE NAME='表名'); -- INFO2=16384(0x4000) 表示该列已加密(不区分透明/半透明)
-- 功能验证:以非归属用户执行 SELECT * FROM <归属用户>.<表名>; —— 加密列返回 NULL 即半透明加密(透明加密仍可见明文)
6.4 对象定义加密(存储过程/函数/触发器/包等):
CREATE OR REPLACE PROCEDURE proc_arg WITH ENCRYPTION(a IN INT, b INT) AS BEGIN a:=0; b:=a+1; END;
7.1 开启审计(必须使用 SYSAUDITOR 登录执行):
SELECT para_name, para_value FROM v$dm_ini WHERE para_name='ENABLE_AUDIT'; -- 查看
SP_SET_ENABLE_AUDIT(1); -- 0 关闭;1 普通审计;2 普通+实时审计
7.2 添加核心审计规则(SP_AUDIT_STMT,<用户名> 可改为具体用户或 ALL):
SP_AUDIT_STMT('USER', '<用户名>', 'ALL'); -- 用户创建/修改/删除
SP_AUDIT_STMT('CONNECT', '<用户名>', 'ALL'); -- 登录/登出
SP_AUDIT_STMT('GRANT', '<用户名>', 'ALL'); -- 授权
SP_AUDIT_STMT('REVOKE', '<用户名>', 'ALL'); -- 回收权限
SP_AUDIT_STMT('TABLE', '<用户名>', 'ALL'); -- 建/改/删基表
SP_AUDIT_STMT('INDEX', '<用户名>', 'ALL'); -- 索引 DDL
SP_AUDIT_STMT('VIEW', '<用户名>', 'ALL'); -- 视图 DDL
SP_AUDIT_STMT('PROCEDURE', '<用户名>', 'ALL'); -- 存储模块 DDL
SP_AUDIT_STMT('SELECT TABLE', '<用户名>', 'ALL'); -- 查询
SP_AUDIT_STMT('INSERT TABLE', '<用户名>', 'ALL'); -- 插入
SP_AUDIT_STMT('UPDATE TABLE', '<用户名>', 'ALL'); -- 更新
SP_AUDIT_STMT('DELETE TABLE', '<用户名>', 'ALL'); -- 删除
SP_AUDIT_STMT('EXECUTE PROCEDURE', '<用户名>', 'ALL');-- 调用存储过程/函数
7.3 查看审计记录与审计日志路径:
SELECT * FROM "SYSAUDITOR"."V$AUDITRECORDS"; -- 审计记录(需 SYSAUDITOR)
SELECT * FROM V$DM_INI WHERE PARA_NAME LIKE 'AUD_PATH%'; -- 审计日志文件路径(默认实例目录,AUDIT*.log)
7.4 审计日志定期归档(Windows 计划任务,每日 03:00 拷贝):
schtasks /create /tn "DM_AuditArch" /tr "cmd /c xcopy D:\dmdata\DMGM\AUDIT*.log D:\audit_arch\ /y" /sc daily /st 03:00
8.0 前置条件:开启归档模式(关键!)。联机备份(库/表空间/归档备份)必须运行在归档模式下,否则报错 [-8003] 缺少本地或者远程归档。
方式一:联机开启(无需停止服务,ALTER DATABASE MOUNT 会短暂断开所有连接,几秒后恢复 OPEN):
ALTER DATABASE MOUNT;
ALTER DATABASE NORMAL;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST = <实例目录>\arch, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048, HANG_FLAG = 1';
ALTER DATABASE OPEN;
-- 说明:DEST 归档目录由 DM 自动创建;FILE_SIZE 单归档文件大小(MB),SPACE_LIMIT 归档总空间上限(MB),HANG_FLAG=1 写失败时挂起
方式二:手动配置 dmarch.ini(需停止服务,适合建库初始化时配置)。在 dm.ini 所在目录(即 SYSTEM_PATH)创建 dmarch.ini:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = <实例目录>\arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 2048
ARCH_HANG_FLAG = 1
-- 然后编辑 dm.ini 设置 ARCH_INI=1,重启数据库实例
-- 验证(两种方式通用):
SELECT ARCH_MODE FROM V$DATABASE; -- 期望 Y
SELECT * FROM V$DM_ARCH_INI; -- 期望 ARCHIVE_LOCAL1 且 ARCH_IS_VALID=Y
8.1 手工全量加密备份(国密 SM4 完全加密;【实测验证通过】本机 DAMENG 实例已成功执行):
BACKUP DATABASE BACKUPSET 'D:\backup\gm_full_01' IDENTIFIED BY "<备份密码>" WITH ENCRYPTION 2 ENCRYPT WITH OPENSSL_SM4_CBC;
-- WITH ENCRYPTION:0 不加密;1 简单加密(仅口令,内容明文);2 完全数据加密(密文存储)
-- 备份集生成 .bak 与 .meta 文件;备份密码按 PWD_POLICY 策略设置
8.2 表空间 / 归档加密备份(【实测验证通过】GM_TEST 表空间 OPENSSL_SM4_CBC 加密备份 9 秒完成):
BACKUP TABLESPACE GMTS BACKUPSET 'D:\backup\gm_ts_01' IDENTIFIED BY "<备份密码>" ENCRYPT WITH OPENSSL_SM4_CBC;
BACKUP ARCHIVELOG ALL BACKUPSET 'D:\backup\gm_arch_01' IDENTIFIED BY "<备份密码>" ENCRYPT WITH OPENSSL_SM4_CBC;
8.3 定时全备(Windows 计划任务,每日 02:00):
schtasks /create /tn "DM_FullBackup" /tr "cmd /c D:\dmdbms\bin\disql.exe SYSDBA/<密码>@localhost:5237 -e \"BACKUP DATABASE BACKUPSET 'D:\backup\gm_daily' IDENTIFIED BY '<备份密码>' WITH ENCRYPTION 2 ENCRYPT WITH OPENSSL_SM4_CBC;\"" /sc daily /st 02:00
8.4 注意事项:① 增量备份的加密密码、类型与算法必须与基备份一致;② 归档开启后日志持续增长,建议定期归档备份并清理(SF_ARCHIVELOG_DELETE_BEFORE_TIME / SF_ARCHIVELOG_DELETE_BEFORE_LSN);③ 定期在隔离环境做 RESTORE 还原演练验证备份可用。
9.1 生成 RSA 公钥/私钥(dmkey 工具,位于 D:\dmdbms\bin):
dmkey PATH=D:\dmdata pubkey=test.pubkey -- 生成 test.pubkey 与 dm_login.prikey
dmkey PRIKEY=D:\dmdata\dm_login.prikey -- 查看私钥信息(校验公私钥匹配)
9.2 服务端配置(私钥放入 SYSTEM_PATH 目录,强制证书加密):
-- dm.ini 中设置 FORCE_CERTIFICATE_ENCRYPTION=1,重启服务
9.3 客户端配置(dm_svc.conf 增加):
LOGIN_CERTIFICATE=(D:\dmdata\test.pubkey)
9.4 UKEY 身份鉴别(可选,需厂商 UKEY 动态库):
disql "SYSDBA/<密码>@LOCALHOST#{UKEY_NAME=<加密引擎名>,UKEY_PIN=<PIN>}"
| 检查项 | 验证指令 | 期望结果 | 状态 |
|---|---|---|---|
| 国密算法注册 | SELECT * FROM V$EXTERNAL_CIPHERS; |
OPENSSL_SM4 系列与 OPENSSL_SM3 的 VALID=Y | □ 通过 / □ 未通过 |
| 全库加密 | SELECT SF_GET_ENCRYPT_NAME(); |
返回 OPENSSL_SM4_CBC(未加密为 NULL) | □ 通过 / □ 未通过 |
| 口令策略 | SELECT PARA_NAME,PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='PWD_POLICY'; |
31 | □ 通过 / □ 未通过 |
| 密码过期 | SELECT A.USERNAME,B.LIFE_TIME,B.GRACE_TIME FROM ALL_USERS A,SYSUSERS B WHERE A.USER_ID=B.ID; |
LIFE_TIME=90, GRACE_TIME=30 | □ 通过 / □ 未通过 |
| 访问地址控制 | SELECT A.USERNAME,B.ALLOW_ADDR FROM ALL_USERS A,SYSUSERS B WHERE A.USER_ID=B.ID; |
仅允许配置的 IP | □ 通过 / □ 未通过 |
| 登录失败处理 | SELECT A.USERNAME,B.FAILED_ATTEMPS,B.LOCK_TIME,B.CONN_IDLE_TIME FROM ALL_USERS A,SYSUSERS B WHERE A.USER_ID=B.ID; |
FAILED_ATTEMPS=3, LOCK_TIME=1, IDLE=30 | □ 通过 / □ 未通过 |
| 应用层通信加密 | SELECT * FROM V$PARAMETER WHERE NAME='COMM_ENCRYPT_NAME'; |
OPENSSL_SM4_CBC | □ 通过 / □ 未通过 |
| SSL/TLCP 通信加密 | SELECT para_name,para_value FROM V$DM_INI WHERE para_name='ENABLE_ENCRYPT'; |
5(SSL)或 6(TLCP) | □ 通过 / □ 未通过 |
| 会话连接类型 | SELECT SESS_ID,USER_NAME,PORT_TYPE FROM V$SESSIONS; |
国密 GmSSL 连接 PORT_TYPE=7 | □ 通过 / □ 未通过 |
| 审计开关 | SELECT para_name,para_value FROM v$dm_ini WHERE para_name='ENABLE_AUDIT'; |
1 | □ 通过 / □ 未通过 |
| 审计记录 | SELECT COUNT(*) FROM "SYSAUDITOR"."V$AUDITRECORDS"; |
>0,且含登录/DDL/DML 记录 | □ 通过 / □ 未通过 |
| 备份加密 | BACKUP DATABASE ... WITH ENCRYPTION 2 ENCRYPT WITH OPENSSL_SM4_CBC; |
备份成功;还原时需输入备份密码 | □ 通过 / □ 未通过 |
服务启停:net start DmServiceDMGM / net stop DmServiceDMGM(管理员 CMD)进入 DIsql:cd D:\dmdbms\bin && disql SYSDBA/<密码>@localhost:5237查看 DM 服务列表:services.msc(过滤 DmService)查看实例参数:SELECT * FROM V$PARAMETER WHERE NAME='<参数名>';确认动态库存在:dir D:\dmdbms\bin\dependencies\libcrypto-3-x64.dll计划任务管理:schtasks /query /tn "DM_FullBackup"(查看)/ /delete /tn ...(删除)引用自《DM8 国密(商用密码)测试常用指令速查》,与正文配套使用。
| 指令 | 一句话说明 |
|---|---|
SELECT * FROM V$CIPHERS; |
查看 DM 支持的全部内置加密/散列算法,确认国密 SM 系列算法已注册。 |
SELECT * FROM V$EXTERNAL_CIPHERS; |
查看第三方加密算法(OPENSSL_SM4/SM3、渔翁 FM_SM1/SM2/SM3/SM4/SM6 等)及其动态库、有效性(VALID=Y 才可用)。 |
SELECT NAME FROM V$EXTERNAL_CIPHER_LIBS; |
查看已加载的第三方加密引擎名,供 dminit 的 EXTERNAL_CRYPTO_NAME / RANDOM_CRYPTO 引用。 |
SELECT CYT_NAME FROM V$CIPHERS WHERE CYT_TYPE=4; |
列出散列算法(如 OPENSSL_SM3),供列加密 HASH WITH 子句选用。 |
| 指令 | 一句话说明 |
|---|---|
./dminit PATH=... ENCRYPT_NAME=OPENSSL_SM4_CBC |
建库时指定全库加密算法为国密 SM4,数据页密文落盘。 |
./dminit PATH=... RLOG_ENCRYPT_NAME=OPENSSL_SM4_CBC |
建库时指定联机/归档日志加密算法为国密 SM4。 |
./dminit PATH=... PAGE_ENC_SLICE_SIZE=4096 |
设置数据页加密分片大小(0/512/4096 字节)。 |
./dminit PATH=... EXTERNAL_CRYPTO_NAME=<引擎名> |
指定服务器根密钥加密引擎(外部加密机/加密卡/UKEY)。 |
./dminit PATH=... RANDOM_CRYPTO=<引擎名> |
指定随机数算法所在加密引擎。 |
./dminit PATH=... EXTERNAL_CIPHER_NAME=OPENSSL_SM4_CBC |
设置库默认加密算法(未显式指定算法时采用)。 |
SELECT SF_GET_ENCRYPT_NAME(); |
查询当前库的全库加密算法名(未加密返回 NULL)。 |
SELECT SF_GET_PARA_VALUE(2,'RLOG_ENC_ID'); |
查询日志文件加密算法 ID。 |
| 指令 | 一句话说明 |
|---|---|
CREATE TABLESPACE TS1 DATAFILE 'TS1.DBF' SIZE 128 ENCRYPT WITH OPENSSL_SM4_CBC BY "密码"; |
创建表空间时指定国密 SM4 透明加密(已全库加密则不能再做)。 |
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC); |
建表时对指定列做国密 SM4 透明加密。 |
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC HASH WITH OPENSSL_SM3 SALT); |
列加密并附加 SM3 散列做完整性校验。 |
CREATE TABLE T(C1 INT ENCRYPT MANUAL); |
半透明加密列,用户仅见自己插入的数据。 |
CREATE TABLE T(C1 INT ENCRYPT WITH OPENSSL_SM4_CBC MANUAL USER (USER01,USER02)); |
按列半透明加密,仅指定用户可见明文。 |
CREATE USER U1 IDENTIFIED BY "密码" ENCRYPT BY "存储密钥"; |
创建用户时指定存储加密密钥(半透明加密用)。 |
SP_SET_PARA_VALUE(1,'AUTO_ENCRYPT',1); |
打开手动输入列存储密钥开关。 |
SELECT CFALGORITHMSENCRYPT('明文', <算法ID>, '密钥'); |
非透明加密函数。 |
SELECT CFALGORITHMSDECRYPT(<密文>, <算法ID>, '密钥'); |
非透明解密函数。 |
CREATE PROCEDURE proc WITH ENCRYPTION(...) AS ... END; |
存储过程/函数/包等对象定义加密。 |
| 指令 | 一句话说明 |
|---|---|
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',6); |
开启商密 TLCP 认证加密(国密 SM2 证书双向验证+加密)。 |
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',1); |
开启 SSL 双向认证+加密。 |
SP_SET_PARA_VALUE(2,'MIN_SSL_VERSION',0x0303); |
设置最低 TLS 版本为 TLSv1.2。 |
SELECT * FROM V$PARAMETER WHERE NAME='ENABLE_ENCRYPT'; |
查询 ENABLE_ENCRYPT 当前值。 |
SELECT para_name,para_value FROM V$DM_INI WHERE para_name='ENABLE_ENCRYPT'; |
确认 SSL/TLCP 是否开启成功。 |
disql SYSDBA/密码@host:port#"{ssl_path=...,ssl_pwd=...}" |
客户端带 SSL/TLCP 证书连接。 |
SELECT SESS_ID,USER_NAME,PORT_TYPE FROM V$SESSIONS; |
查看会话连接类型(PORT_TYPE=7 为国密 GmSSL)。 |
SP_SET_PARA_STRING_VALUE(2,'COMM_ENCRYPT_NAME','OPENSSL_SM4_CBC'); |
开启应用层消息包加密(国密 SM4)。 |
SELECT CYT_NAME FROM V$CIPHERS WHERE (CYT_TYPE=1 OR CYT_TYPE=2) AND (WORK_MODE!='ECB_NOPAD' AND WORK_MODE!='CBC_NOPAD'); |
列出可用于消息包加密的算法。 |
| 指令 | 一句话说明 |
|---|---|
BACKUP DATABASE BACKUPSET '路径' IDENTIFIED BY "密码" WITH ENCRYPTION 2 ENCRYPT WITH OPENSSL_SM4_CBC; |
全量备份并做国密 SM4 完全加密。 |
BACKUP DATABASE BACKUPSET '路径' IDENTIFIED BY "密码" WITH ENCRYPTION 1; |
简单加密备份(仅口令,内容明文)。 |
BACKUP TABLESPACE TS1 BACKUPSET '路径' IDENTIFIED BY "密码" ENCRYPT WITH OPENSSL_SM4_CBC; |
表空间备份加密。 |
(增量备份)加密参数须与基备份一致 |
增量备份加密一致性要求。 |
| 指令 | 一句话说明 |
|---|---|
dmkey PATH=目录 pubkey=公钥名 |
生成登录加解密公钥/私钥文件。 |
dmkey PRIKEY=私钥路径 |
查看私钥信息(校验公私钥匹配)。 |
FORCE_CERTIFICATE_ENCRYPTION=1(dm.ini) |
强制登录用户名密码证书加密。 |
dm_svc.conf: LOGIN_CERTIFICATE=(公钥路径) |
客户端指定登录加密公钥。 |
disql "SYSDBA/密码@LOCALHOST#{UKEY_NAME=引擎名,UKEY_PIN=PIN}" |
UKEY 身份鉴别连接。 |
| 指令 | 一句话说明 |
|---|---|
SP_UPDATE_SVRKEY(); |
更新服务器主密钥 SVR_KEY。 |
SP_UPDATE_DBKEY(); |
更新数据库主密钥 DB_KEY。 |
依据现场实测
SELECT CYT_NAME, CYT_TYPE, BLOCK_SIZE, EXTEND_SIZE, WORK_MODE FROM V$CIPHERS的结果,
按《DM8 安全管理》第 7.1.1 / 7.1.2 / 7.1.3 节及备份、通信加密章节的限制条件判定(PAGE_ENC_SLICE_SIZE=4096 默认分片)。
| 算法 | EXTEND | 全库加密 | 日志加密 | 表空间加密 | 列加密 | 备份加密 | 通信加密 |
|---|---|---|---|---|---|---|---|
| OPENSSL_SM4_ECB | 16 | 可用 | 可用 | 不可用(膨胀>0) | 可用 | 可用 | 可用 |
| OPENSSL_SM4_CBC | 16 | 可用 | 可用 | 不可用(膨胀>0) | 可用 | 可用 | 可用 |
| OPENSSL_SM4_CFB | 16 | 可用 | 可用 | 不可用(膨胀>0) | 可用 | 可用 | 可用 |
| OPENSSL_SM4_OFB | 16 | 可用 | 可用 | 不可用(膨胀>0) | 可用 | 可用 | 可用 |
| OPENSSL_SM4_CFB_V1 | 0 | 可用 | 可用 | 可用(推荐) | 可用 | 可用 | 可用 |
| OPENSSL_SM4_OFB_V1 | 0 | 可用 | 可用 | 可用(推荐) | 可用 | 可用 | 可用 |
| OPENSSL_SM4_ECB_NOPAD | 0 | 不建议 | 不可用 | 不可用 | 不可用 | 不可用 | 不可用 |
| OPENSSL_SM4_CBC_NOPAD | 0 | 不建议 | 不可用 | 不可用 | 不可用 | 不可用 | 不可用 |
| OPENSSL_SM3 | - | 不适用(散列) | 不适用(散列) | 不适用(散列) | HASH WITH 可用 | 不适用(散列) | 不适用(散列) |
判定依据:① 全库加密(分片非0)不支持“EXTEND_SIZE=0 且模式 ECB/CBC”及块大小>16 的算法;
② 表空间加密(分片非0)额外不支持 ECB/CBC 模式、扩展长度>0、密文长度≠明文长度的算法(即仅 CFB/OFB 流式且不膨胀可用);
③ 日志/列/备份/通信加密均排除 NOPAD 模式。若将 PAGE_ENC_SLICE_SIZE 设为 0,则表空间/全库加密也可使用 EXTEND_SIZE≤块大小(16)的 ECB/CBC 算法,但需在建库时指定且不可修改。
文章
阅读量
获赞
