温馨提示×

Oracle在Ubuntu上如何实现数据加密

小樊
53
2025-10-18 20:58:13
栏目: 云计算

Oracle在Ubuntu上实现数据加密的主要方法

1. 透明数据加密(TDE)

透明数据加密(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存储加密密钥),避免密钥泄露。

2. 使用DBMS_CRYPTO包进行高级加密

DBMS_CRYPTO是Oracle的内置包,提供灵活的加密功能,支持AES、DES、3DES等多种算法,适用于需要自定义加密逻辑的场景。其使用流程包括密钥生成、数据加密、数据解密

  • 加密示例(以AES-256-CBC为例):
    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,适合有复杂加密需求的场景。

3. 文件系统级别加密

通过Ubuntu的eCryptfsLUKS/dm-crypt工具对Oracle数据文件所在的文件系统进行加密,保护整个数据库文件(包括数据文件、控制文件、重做日志文件)。

  • eCryptfs加密步骤
    1. 安装eCryptfs工具:sudo apt-get install ecryptfs-utils
    2. 创建加密挂载点:sudo mkdir /encrypted_oracle_data
    3. 挂载加密文件系统:sudo mount -t ecryptfs /dev/sdX /encrypted_oracle_data(替换/dev/sdX为实际数据分区);
    4. 设置加密密码:sudo ecryptfs-setup-passphrase /encrypted_oracle_data
    5. 移动Oracle数据文件至加密目录,并修改Oracle配置中的数据文件路径。
  • LUKS/dm-crypt加密步骤
    1. 安装cryptsetup:sudo apt-get install cryptsetup
    2. 初始化加密分区:sudo cryptsetup luksFormat /dev/sdX
    3. 打开加密分区:sudo cryptsetup luksOpen /dev/sdX encrypted_oracle
    4. 格式式并挂载分区:sudo mkfs.ext4 /dev/mapper/encrypted_oraclesudo mount /dev/mapper/encrypted_oracle /u01/app/oracle/oradata
      文件系统加密的优势是保护范围广(覆盖所有数据库文件),但可能对系统性能有一定影响,适合对整体数据安全要求高的场景。

4. SSL/TLS加密数据传输

虽然不是直接的数据存储加密,但SSL/TLS可加密客户端与Oracle服务器之间的数据传输(如SQL*Net流量),防止数据在传输过程中被窃取或篡改。配置步骤包括:

  1. 生成SSL证书(可使用Oracle Wallet或第三方CA证书);
  2. 配置Oracle监听器(listener.ora)启用SSL:
    LISTENER =
      (ADDRESS = (PROTOCOL = TCPS)(HOST = your_host)(PORT = 2484))  -- 使用TCPS协议
    
  3. 配置数据库服务(tnsnames.ora)使用SSL连接:
    ORCL =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCPS)(HOST = your_host)(PORT = 2484))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = orcl)
        )
      )
    
  4. 强制客户端使用SSL连接(通过SQLNET.AUTHENTICATION_SERVICES参数)。

以上方法可根据安全需求(如存储加密、传输加密)、业务场景(如特定列加密、整体表空间加密)选择使用。需注意,无论采用哪种方法,密钥管理(如密钥存储、备份、轮换)是加密策略的核心,需妥善保护以避免加密失效。

0