-- 创建 Software Keystore ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/admin/wallet' IDENTIFIED BY "MyStr0ngP@ssw0rd!";
-- 创建 Auto Login Keystore(推荐) ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/u01/app/oracle/admin/wallet' IDENTIFIED BY "MyStr0ngP@ssw0rd!";
步骤三:打开 Keystore
1 2 3 4 5 6 7
-- 手动打开 Keystore ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "MyStr0ngP@ssw0rd!";
-- 确认状态 SELECT WRL_TYPE, WRL_PARAMETER, STATUS, WALLET_TYPE FROM V$ENCRYPTION_WALLET;
步骤四:设置 Master Key
1 2 3 4 5 6 7
-- 首次设置 Master Key(必须在 Keystore 打开状态下执行) ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "MyStr0ngP@ssw0rd!" WITH BACKUP USING'initial_key_backup';
-- 验证 Master Key 已设置 SELECT TAG, ENCRYPTION_TIME FROM V$ENCRYPTED_TABLESPACES;
-- 创建加密表空间并指定加密算法 CREATE TABLESPACE secure_data DATAFILE '/u01/oradata/ORCL/secure_data01.dbf' SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 10G ENCRYPTION USING'AES256' DEFAULT STORAGE(ENCRYPT);
现有表空间在线加密(12c+)
1 2 3 4 5 6 7 8 9 10 11
-- 在线加密现有表空间(12cR2+ 新特性) ALTER TABLESPACE users ENCRYPTION ONLINE USING'AES256' ENCRYPT;
-- 监控加密进度 SELECT TABLESPACE_NAME, ENCRYPTED, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME ='USERS';
-- 查看加密进度 SELECT*FROM V$SESSION_LONGOPS WHERE OPNAME LIKE'%ENCRYPT%';
列级加密
1 2 3 4 5 6 7 8 9 10
-- 对特定列进行加密 ALTER TABLE hr.employees ADD (ssn_encrypted VARCHAR2(11) ENCRYPT USING'AES256');
-- 使用 NO SALT 选项(允许在加密列上创建索引) ALTER TABLE hr.employees ADD (ssn_encrypted VARCHAR2(11) ENCRYPT USING'AES256'NO SALT);
-- 对已有列进行加密 ALTER TABLE hr.employees MODIFY (salary ENCRYPT);
3.3 Keystore 管理
Keystore 备份
1 2 3 4
-- 备份 Keystore(密码修改前必须备份) ADMINISTER KEY MANAGEMENT BACKUP KEYSTORE USING'keystore_backup_20260609' IDENTIFIED BY "MyStr0ngP@ssw0rd!";
Keystore 密码修改
1 2 3 4
-- 修改 Keystore 密码 ADMINISTER KEY MANAGEMENT ALTER KEYSTORE PASSWORD IDENTIFIED BY "MyStr0ngP@ssw0rd!" SET "NewStr0ngP@ssw0rd!" WITH BACKUP USING'pwd_change_backup';
-- 定期轮换 Master Key(最佳实践:每 90 天一次) -- 在 CDB$ROOT 执行 ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY "MyStr0ngP@ssw0rd!" WITH BACKUP USING'key_rotation_20260609';
-- 在各 PDB 中执行 ALTER SESSION SET CONTAINER = pdb1;
ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY "MyStr0ngP@ssw0rd!" WITH BACKUP USING'pdb1_key_rotation_20260609';
四、结果验证
4.1 查看加密表空间
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 查看所有加密表空间 SELECT ts.name AS tablespace_name, e.ts#, e.encryptionalg AS algorithm, DECODE(e.encryptedts, 0, 'NO', 'YES') AS encrypted FROM V$ENCRYPTED_TABLESPACES e JOIN V$tablespace ts ON e.ts# = ts.ts# ORDERBY ts.name;
-- 更简洁的方式 SELECT TABLESPACE_NAME, ENCRYPTED FROM DBA_TABLESPACES WHERE ENCRYPTED ='YES';
4.2 查看加密列
1 2 3 4
-- 查看所有加密列 SELECT owner, table_name, column_name, encryption_alg, salt FROM DBA_ENCRYPTED_COLUMNS ORDERBY owner, table_name, column_name;
DECLARE v_wallet_status VARCHAR2(30); v_enc_ts_count NUMBER; v_enc_col_count NUMBER; BEGIN -- 检查 Keystore 状态 SELECT STATUS INTO v_wallet_status FROM V$ENCRYPTION_WALLET WHERE WRL_TYPE ='FILE'AND ROWNUM =1;
IF v_wallet_status !='OPEN'THEN DBMS_OUTPUT.PUT_LINE('WARNING: Keystore is not OPEN! Status: '|| v_wallet_status); ELSE DBMS_OUTPUT.PUT_LINE('OK: Keystore is OPEN'); END IF;
-- 统计加密表空间 SELECTCOUNT(*) INTO v_enc_ts_count FROM DBA_TABLESPACES WHERE ENCRYPTED ='YES'; DBMS_OUTPUT.PUT_LINE('Encrypted tablespaces: '|| v_enc_ts_count);
-- 统计加密列 SELECTCOUNT(*) INTO v_enc_col_count FROM DBA_ENCRYPTED_COLUMNS; DBMS_OUTPUT.PUT_LINE('Encrypted columns: '|| v_enc_col_count); END; /
五、经验总结
5.1 TDE 最佳实践
优先使用表空间级加密:比列级加密更简单、性能更好、对应用完全透明
使用 AES256 算法:安全性与性能的最佳平衡
启用 Auto Login Keystore:避免数据库重启后手动打开 Keystore
定期轮换 Master Key:建议每 90 天轮换一次,满足合规要求
Keystore 与数据文件分开存储:不要将 Wallet 放在数据文件同一目录
5.2 Key 管理策略
Keystore 备份:每次 Key 操作前必须备份,备份文件存储在安全位置
密码管理:使用强密码并记录在密码管理系统中
灾难恢复:确保 Wallet 备份可在异地恢复,DR 环境需要同步 Wallet
权限控制:Wallet 目录权限设为 700,仅 Oracle 用户可访问
5.3 性能影响评估
根据实际生产环境经验:
场景
CPU 开销
I/O 开销
备注
OLTP 读写
1%~3%
无
AES-NI 硬件加速
批量加载
3%~5%
无
可考虑临时关闭
查询
0%
无
Buffer Cache 中为明文
5.4 常见问题处理
问题一:数据库重启后无法访问加密数据
1 2 3 4 5 6 7 8 9
-- 原因:Keystore 未打开 -- 解决:打开 Keystore ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "MyStr0ngP@ssw0rd!";
-- 或启用 Auto Login(推荐) ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/u01/app/oracle/admin/wallet' IDENTIFIED BY "MyStr0ngP@ssw0rd!";