如何在Ubuntu上实现Oracle数据加密
导读:在 Ubuntu 上实现 Oracle 数据加密的可落地方案 一 方案总览与选型 透明数据加密 TDE:在列级或表空间级对静态数据进行自动加解密,对应用透明,适合大规模落地与合规审计。主密钥可存放在Oracle Wallet或HSM,生产...
在 Ubuntu 上实现 Oracle 数据加密的可落地方案
一 方案总览与选型
- 透明数据加密 TDE:在列级或表空间级对静态数据进行自动加解密,对应用透明,适合大规模落地与合规审计。主密钥可存放在Oracle Wallet或HSM,生产环境建议结合 Oracle Key Manager(OKM) 做企业级密钥管理。TDE 属于 Oracle Advanced Security 能力,通常要求 Oracle 企业版。
- 应用层加密 DBMS_CRYPTO:在 SQL/PLSQL 中调用包对敏感字段进行加解密,灵活可控,便于自定义算法与密钥策略,但需改造应用或视图/触发器,密钥由应用管理。
- 脱敏与哈希:用于展示或校验场景(如 MD5/SHA 哈希、DBMS_OBFUSCATION_TOOLKIT),不用于可逆加密,适合测试、日志与对账等用途。
二 前置条件与钱包配置
- 版本与许可:确认数据库为Oracle 企业版并已启用 Advanced Security/TDE 选项;TDE 支持 列级与表空间级加密。
- 创建钱包目录并配置自动登录(Ubuntu 示例):
- 建议目录:/u01/app/oracle/admin/wallet(属主 oracle:oinstall,权限 700)
- sqlnet.ora(位于 $ORACLE_HOME/network/admin)添加:
- 指定钱包目录:
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/admin/wallet))) - 可选自动登录:
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/admin/wallet)))
SQLNET.AUTHENTICATION_SERVICES=(BEQ, TCPS)
SSL_CLIENT_AUTHENTICATION=FALSE
- 指定钱包目录:
- 创建并打开钱包、生成主密钥(以 SYSDBA 执行):
- 创建钱包:
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE ‘/u01/app/oracle/admin/wallet’ IDENTIFIED BY “YourWalletPass”; - 打开钱包:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY “YourWalletPass”; - 创建主密钥(可指定密钥存储属性,如标识/标签):
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE ‘/u01/app/oracle/admin/wallet’ IDENTIFIED BY “YourWalletPass”;
说明:钱包用于安全保存 TDE 主密钥;生产可对接 OKM/HSM 提升密钥安全与审计能力。
- 创建钱包:
三 实施路径一 TDE 列级与表空间级加密
- 列级加密(适合少量高敏字段,如身份证号、银行卡号):
- 建表时加密列:
CREATE TABLE cust ( id NUMBER, ssn VARCHAR2(11) ENCRYPT ); - 将现有列改为加密列(注意类型与长度、索引与约束影响):
ALTER TABLE cust MODIFY (ssn VARCHAR2(11) ENCRYPT);
- 建表时加密列:
- 表空间级加密(适合整表/整库落地,业务无感):
- 创建加密表空间:
CREATE TABLESPACE enc_ts DATAFILE ‘/u01/app/oracle/oradata/ORCL/enc_ts01.dbf’ SIZE 500M ENCRYPTION = ENCRYPT; - 在线加密(不停机,适合生产):
ALTER TABLESPACE users ENCRYPTION ONLINE;
- 创建加密表空间:
- 要点与影响:
- TDE 采用两层密钥(主密钥在钱包/HSM,数据加密密钥在库内),对应用透明;丢失主密钥将导致数据不可恢复。
- 列级加密可能影响索引、外键、函数索引、导出导入等,需评估与测试;表空间级对应用影响最小。
- 生产建议将主密钥托管在 OKM/HSM,并按数据保留策略规划密钥轮换与审计。
四 实施路径二 应用层加密 DBMS_CRYPTO 示例
- 典型场景:对特定字段在写入时加密、读取时解密;密钥由应用或 KMS 管理,不依赖数据库钱包。
- 示例(AES-256-CBC + PKCS5 填充,密钥与 IV 由安全模块/配置中心提供):
- 加密函数: CREATE OR REPLACE FUNCTION f_encrypt( p_plain IN VARCHAR2, p_key IN RAW, p_iv IN RAW ) RETURN RAW IS v_src RAW(32767) := UTL_I18N.STRING_TO_RAW(p_plain, ‘AL32UTF8’); BEGIN RETURN DBMS_CRYPTO.ENCRYPT( src => v_src, typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, key => p_key, iv => p_iv ); END; /
- 解密函数: CREATE OR REPLACE FUNCTION f_decrypt( p_cipher IN RAW, p_key IN RAW, p_iv IN RAW ) RETURN VARCHAR2 IS v_dst RAW(32767); BEGIN v_dst := DBMS_CRYPTO.DECRYPT( src => p_cipher, typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, key => p_key, iv => p_iv ); RETURN UTL_I18N.RAW_TO_CHAR(v_dst, ‘AL32UTF8’); END; /
- 使用提示:
- 建议对每条记录使用唯一 IV(如安全随机数),并与密文一并存储;密钥严禁硬编码,建议接入 KMS/HSM。
- 对大对象(BLOB/CLOB)可分块加解密;涉及范围查询/排序的列不宜应用层加密(可考虑 TDE 或确定性加密+索引设计)。
五 运维与合规要点
- 备份与恢复:启用 TDE 后,确保RMAN 备份包含钱包文件或钱包处于打开状态;恢复时先打开钱包再恢复数据文件。
- 高可用与集群:在 RAC/Data Guard 环境中,主密钥需在集群各节点一致可用;结合 OKM/HSM 可实现统一密钥管理与审计。
- 密钥管理:主密钥丢失即数据不可恢复;制定轮换策略(如按年轮换)与保留期(仅解密期),并在 OKM 中落实密钥组与访问控制。
- 合规与审计:结合企业策略对钱包访问、密钥操作、TDE DDL进行审计;如涉及国密合规,需评估算法与密码产品适配。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何在Ubuntu上实现Oracle数据加密
本文地址: https://pptw.com/jishu/757801.html
