透明数据加密(TDE)是Oracle提供的数据库层自动加密技术,无需修改应用程序代码,可实现对敏感数据的存储加密。TDE支持列级加密和表空间级加密两种模式:
ENCRYPT关键字;加密现有列时,通过ALTER TABLE语句添加新加密列。例如:-- 创建包含加密列的表
CREATE TABLE sensitive_data (
id NUMBER,
ssn VARCHAR2(11) ENCRYPT, -- 社会安全号码列加密
name VARCHAR2(50)
);
-- 加密现有表的列
ALTER TABLE employees ADD (email_address VARCHAR2(100) ENCRYPT);
ENCRYPTION参数。例如:-- 创建加密表空间
CREATE TABLESPACE encrypted_ts
DATAFILE '/u01/app/oracle/oradata/ORCL/encrypted_ts.dbf' SIZE 100M
ENCRYPTION ENCRYPT; -- 启用加密
TDE的优势是对应用程序透明,但需注意密钥管理(如使用Oracle Wallet存储加密密钥),避免密钥泄露。
DBMS_CRYPTO是Oracle的内置包,提供灵活的加密功能,支持AES、DES、3DES等多种算法,适用于需要自定义加密逻辑的场景。其使用流程包括密钥生成、数据加密、数据解密:
DECLARE
l_key RAW(32) := UTL_RAW.CAST_TO_RAW('my_32_byte_secret_key_123456'); -- 32字节AES密钥
l_iv RAW(16) := UTL_RAW.CAST_TO_RAW('16_byte_iv_123456'); -- 16字节初始化向量
l_data RAW(2000) := UTL_RAW.CAST_TO_RAW('Sensitive data to encrypt');
l_encrypted_data RAW(2000);
BEGIN
l_encrypted_data := DBMS_CRYPTO.ENCRYPT(
src => l_data,
typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
key => l_key,
iv => l_iv
);
DBMS_OUTPUT.PUT_LINE('Encrypted: ' || RAWTOHEX(l_encrypted_data));
END;
DECLARE
l_key RAW(32) := UTL_RAW.CAST_TO_RAW('my_32_byte_secret_key_123456');
l_iv RAW(16) := UTL_RAW.CAST_TO_RAW('16_byte_iv_123456');
l_encrypted_data RAW(2000) := HEXTORAW('...'); -- 替换为加密后的十六进制字符串
l_decrypted_data RAW(2000);
BEGIN
l_decrypted_data := DBMS_CRYPTO.DECRYPT(
src => l_encrypted_data,
typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
key => l_key,
iv => l_iv
);
DBMS_OUTPUT.PUT_LINE('Decrypted: ' || UTL_I18N.RAW_TO_CHAR(l_decrypted_data, 'AL32UTF8'));
END;
DBMS_CRYPTO的优势是灵活性高,但需手动管理密钥和IV,适合有复杂加密需求的场景。
通过Ubuntu的eCryptfs或LUKS/dm-crypt工具对Oracle数据文件所在的文件系统进行加密,保护整个数据库文件(包括数据文件、控制文件、重做日志文件)。
sudo apt-get install ecryptfs-utils;sudo mkdir /encrypted_oracle_data;sudo mount -t ecryptfs /dev/sdX /encrypted_oracle_data(替换/dev/sdX为实际数据分区);sudo ecryptfs-setup-passphrase /encrypted_oracle_data;sudo apt-get install cryptsetup;sudo cryptsetup luksFormat /dev/sdX;sudo cryptsetup luksOpen /dev/sdX encrypted_oracle;sudo mkfs.ext4 /dev/mapper/encrypted_oracle,sudo mount /dev/mapper/encrypted_oracle /u01/app/oracle/oradata。虽然不是直接的数据存储加密,但SSL/TLS可加密客户端与Oracle服务器之间的数据传输(如SQL*Net流量),防止数据在传输过程中被窃取或篡改。配置步骤包括:
listener.ora)启用SSL:LISTENER =
(ADDRESS = (PROTOCOL = TCPS)(HOST = your_host)(PORT = 2484)) -- 使用TCPS协议
tnsnames.ora)使用SSL连接:ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = your_host)(PORT = 2484))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
SQLNET.AUTHENTICATION_SERVICES参数)。以上方法可根据安全需求(如存储加密、传输加密)、业务场景(如特定列加密、整体表空间加密)选择使用。需注意,无论采用哪种方法,密钥管理(如密钥存储、备份、轮换)是加密策略的核心,需妥善保护以避免加密失效。