在Oracle中,有以下几种常用的系统加密方法:
- 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,其中有id和secret_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;- 透明数据加密(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表空间中的所有数据进行加密。当数据被写入这个表空间或者从这个表空间读取时,会自动进行加密和解密操作。
- 哈希函数(如ORA_HASH)
- 概述:哈希函数不是用于加密数据本身,而是用于生成数据的哈希值。哈希值是一种固定长度的数字或字符串,它是根据输入数据通过哈希算法计算得到的。在密码存储等场景中,可以存储密码的哈希值而不是密码本身。当用户登录时,计算输入密码的哈希值并与存储的哈希值进行比较,来验证密码的正确性。
- 使用示例:
ORA_HASH函数是Oracle自带的哈希函数。例如,要计算一个字符串'my_password'的哈希值,可以使用如下语句:
SELECT ORA_HASH('my_password') FROM dual;- 这个函数返回一个数值型的哈希值。在实际应用中,如用户注册和登录系统中,可以在用户注册时计算密码的哈希值并存储在用户表中。在用户登录时,计算用户输入密码的哈希值,并与存储的哈希值进行比对来验证身份。不过,
ORA_HASH相对较简单,在安全性要求更高的场景下,可能需要使用更复杂的哈希算法,如SHA - 256等,可以通过自定义函数或者外部库来实现。
















