在Oracle中,有以下几种常用的系统加密方法:

  1. DBMS_CRYPTO包
  • 概述:这是Oracle提供的用于加密和解密数据的强大工具包。它支持多种加密算法,如AES(高级加密标准)、DES(数据加密标准)等。
  • 使用示例
  • 假设要对一个名为secret_data的列中的数据进行加密。首先,需要在数据库中创建一个函数来执行加密操作。
CREATE OR REPLACE FUNCTION encrypt_data (
  p_input VARCHAR2,
  p_key VARCHAR2
) RETURN RAW IS
  l_encrypted_raw RAW(2000);
  l_key RAW(2000) := UTL_I18N.STRING_TO_RAW(p_key, 'AL32UTF8');
BEGIN
  l_encrypted_raw := DBMS_CRYPTO.ENCRYPT(
    src => UTL_I18N.STRING_TO_RAW(p_input, 'AL32UTF8'),
    typ => DBMS_CRYPTO.DES_CBC_PKCS5,
    key => l_key
  );
  RETURN l_encrypted_raw;
END;
  • 在上述函数中,encrypt_data函数接受两个参数:p_input是要加密的字符串,p_key是加密密钥。它将输入字符串转换为RAW类型,然后使用DBMS_CRYPTO.ENCRYPT过程进行加密,这里采用的是DES_CBC_PKCS5加密模式。加密后的结果以RAW类型返回。
  • 要使用这个函数对表中的数据进行加密,假设存在一个表my_table,其中有idsecret_data列,可以使用如下的UPDATE语句:
UPDATE my_table
SET secret_data = encrypt_data(secret_data, 'my_secret_key');
  • 解密函数的创建和使用类似。以下是一个解密函数的示例:
CREATE OR REPLACE FUNCTION decrypt_data (
  p_input RAW,
  p_key VARCHAR2
) RETURN VARCHAR2 IS
  l_decrypted_raw RAW(2000);
  l_key RAW(2000) := UTL_I18N.STRING_TO_RAW(p_key, 'AL32UTF8');
BEGIN
  l_decrypted_raw := DBMS_CRYPTO.DECRYPT(
    src => p_input,
    typ => DBMS_CRYPTO.DES_CBC_PKCS5,
    key => l_key
  );
  RETURN UTL_I18N.RAW_TO_CHAR(l_decrypted_raw, 'AL32UTF8');
END;
  • 可以使用这个解密函数来获取原始数据,例如:
SELECT decrypt_data(secret_data, 'my_secret_key') FROM my_table;
  1. 透明数据加密(TDE)
  • 概述:TDE是Oracle数据库企业版提供的功能,用于加密存储在数据库中的数据。它可以在操作系统文件级别对数据文件、重做日志文件和控制文件进行加密。
  • 工作原理
  • 当启用TDE后,数据库会在写入数据到存储介质时自动加密数据,在从存储介质读取数据时自动解密数据。这个过程对应用程序是透明的,应用程序不需要进行任何特殊的加密或解密操作。
  • 配置步骤
  • 创建钱包(Wallet):钱包是存储加密密钥的安全容器。可以使用ADMINISTER KEY MANAGEMENT命令来创建钱包。例如:
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE 'file:/u01/app/oracle/admin/wallet' IDENTIFIED BY password;
  • 打开钱包:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY password;
  • 为表空间加密:
ALTER TABLESPACE users ENCRYPTION ONLINE;
  • 这将对users表空间中的所有数据进行加密。当数据被写入这个表空间或者从这个表空间读取时,会自动进行加密和解密操作。
  1. 哈希函数(如ORA_HASH)
  • 概述:哈希函数不是用于加密数据本身,而是用于生成数据的哈希值。哈希值是一种固定长度的数字或字符串,它是根据输入数据通过哈希算法计算得到的。在密码存储等场景中,可以存储密码的哈希值而不是密码本身。当用户登录时,计算输入密码的哈希值并与存储的哈希值进行比较,来验证密码的正确性。
  • 使用示例
  • ORA_HASH函数是Oracle自带的哈希函数。例如,要计算一个字符串'my_password'的哈希值,可以使用如下语句:
SELECT ORA_HASH('my_password') FROM dual;
  • 这个函数返回一个数值型的哈希值。在实际应用中,如用户注册和登录系统中,可以在用户注册时计算密码的哈希值并存储在用户表中。在用户登录时,计算用户输入密码的哈希值,并与存储的哈希值进行比对来验证身份。不过,ORA_HASH相对较简单,在安全性要求更高的场景下,可能需要使用更复杂的哈希算法,如SHA - 256等,可以通过自定义函数或者外部库来实现。