为了保护敏感数据,DM提供一个数据加密包dbms_obfuscation_toolkit。利用这个包,用户可以对数据进行DES、DES3加密,或者对数据进行MD5散列。
11.1 相关方法
dbms_obfuscation_toolkit包中包含的过程和函数如下详细介绍:
- DES3DECRYPT
对varbinary数据进行DES3解密。
语法如下:
PROCEDURE DES3DECRYPT(
input IN VARBINARY,
key IN VARBINARY,
decrypted_data OUT VARBINARY,
which IN INT DEFAULT 0,
iv IN VARBINARY DEFAULT NULL
);
返回值
解密后的varbinary数据。
对VARCHAR2数据进行DES3解密。
语法如下:
PROCEDURE DES3DECRYPT(
input_string IN VARCHAR2,
key_string IN VARCHAR2,
decrypted_string OUT VARCHAR2,
which IN INT DEFAULT 0,
iv_string IN VARCHAR2 DEFAULT NULL
);
返回值
解密后的VARCHAR2类型数据。
对varbinary数据进行DES3解密。
语法如下:
FUNCTION DES3DECRYPT(
input IN VARBINARY,
key IN VARBINARY,
which IN INT DEFAULT 0,
iv IN VARBINARY DEFAULT NULL
)RETURN VARBINARY;
返回值
解密后的varbinary数据。
对VARCHAR2数据进行DES3解密。
语法如下:
FUNCTION DES3DECRYPT(
input_string IN VARCHAR2,
key_string IN VARCHAR2,
which IN INT DEFAULT 0,
iv_string IN VARCHAR2 DEFAULT NULL
)RETURN VARCHAR2;
返回值
解密后的VARCHAR2数据。
参数详解
- INPUT_STRING输入参数,需要解密的数据。
- KEY_STRING输入参数,解密数据使用的密钥。
- WHICH输入参数,解密模式,可选值0、1。0表示双密钥DES3解密,1表示三密钥DES3解密。
- IV_STRING输入参数,解密数据使用的初始化向量。
- DES3ENCRYPT
对varbinary数据进行DES3加密。
语法如下:
PROCEDURE DES3Encrypt(
input IN VARBINARY,
key IN VARBINARY,
encrypted_data OUT VARBINARY,
which IN INT DEFAULT 0,
iv IN VARBINARY DEFAULT NULL
);
参数详解
- INPUT输入参数,需要加密的数据。
- KEY输入参数,加密数据使用的密钥。
- eNcrypted_data输出参数,被加密后的数据。
- WHICH
输入参数,加密模式,可选值0、1。0表示双密钥DES3加密,1表示三密钥DES3加密。
- IV输入参数,加密数据使用的初始化向量。
对VARCHAR2数据进行DES3加密。
语法如下:
PROCEDURE DES3Encrypt(
input_string IN VARCHAR2,
key_string IN VARCHAR2,
encrypted_string OUT VARCHAR2,
which IN INT DEFAULT 0,
iv_string IN VARCHAR2 DEFAULT NULL
);
参数详解
- input_string输入参数,需要加密的数据。
- key_string输入参数,加密数据使用的密钥。
- encrypted_string输出参数,被加密后的数据。
- WHICH
输入参数,加密模式,可选值0、1。0表示双密钥DES3加密,1表示三密钥DES3加密。
- iv_string输入参数,加密数据使用的初始化向量。
对varbinary数据进行DES3加密。
语法如下:
FUNCTION DES3Encrypt(
input IN VARBINARY,
key IN VARBINARY,
which IN INT DEFAULT 0,
iv IN VARBINARY DEFAULT NULL
)RETURN VARBINARY;
参数详解
- INPUT输入参数,需要加密的数据。
- KEY输入参数,加密数据使用的密钥。
- WHICH
输入参数,加密模式,可选值0、1。0表示双密钥DES3加密,1表示三密钥DES3加密。
- IV输入参数,加密数据使用的初始化向量。
返回值
返回值加密后的VARBINARY数据。
对VARCHAR2数据进行DES3加密。
语法如下:
FUNCTION DES3Encrypt(
input_string IN VARCHAR2,
key_string IN VARCHAR2,
which IN INT DEFAULT 0,
iv_string IN VARCHAR2 DEFAULT NULL
)RETURN VARCHAR2;
参数详解
- input_string输入参数,需要加密的数据。
- key_string输入参数,加密数据使用的密钥。
- WHICH
输入参数,加密模式,可选值0、1。0表示双密钥DES3加密,1表示三密钥DES3加密。
- iv_string输入参数,加密数据使用的初始化向量。
返回值
返回值加密后的VARCHAR2数据。
- DES3GETKEY
生成VARBINARY类型数据的DES3加密密钥。
语法如下:
PROCEDURE DES3GetKey(
which IN INT DEFAULT 0,
seed IN VARBINARY,
key OUT VARBINARY
);
参数详解
- WHICH
输入参数,DES3工作模式,可选值0、1。0表示双密钥DES3,1表示三密钥DES3。
- seed输入参数,获取DES3密钥使用的种子。
- KEY输出参数,VARBINARY类型的DES3加密密钥。
生成VARchar2类型的DES3加密密钥。
语法如下:
PROCEDURE DES3GetKey(
which IN INT DEFAULT 0,
seed_string IN VARCHAR2,
key OUT VARCHAR2
);
参数详解
- WHICH
输入参数,DES3工作模式,可选值0、1。0表示双密钥DES3,1表示三密钥DES3。
- seed_string输入参数,获取DES3密钥使用的种子。
- KEY输出参数,VARchar2类型的DES3加密密钥。
生成VARBINARY类型的DES3加密密钥。
语法如下:
FUNCTION DES3GetKey(
which IN INT DEFAULT 0,
seed IN VARBINARY
)RETURN VARBINARY;
参数详解
- WHICH
输入参数,DES3工作模式,可选值0、1。0表示双密钥DES3,1表示三密钥DES3。
- seed输入参数,获取DES3密钥使用的种子。
返回值
返回值VARBINARY类型的DES3加密密钥。
生成VARchar2类型的DES3加密密钥。
语法如下:
FUNCTION DES3GetKey(
which IN INT DEFAULT 0,
seed_string IN VARCHAR2
)RETURN VARCHAR2;
参数详解
- WHICH
输入参数,DES3工作模式,可选值0、1。0表示双密钥DES3,1表示三密钥DES3。
- seed_string输入参数,获取DES3密钥使用的种子。
返回值
返回值VARchar2类型的DES3加密密钥。
- DESDECRYPT
对varbinary数据进行DES解密。
语法如下:
PROCEDURE DESDECRYPT(
input IN VARBINARY,
key IN VARBINARY,
decrypted_data OUT VARBINARY
);
参数详解
- INPUT输入参数,需要解密的数据。
- KEY输入参数,解密数据使用的密钥。
- decrypted_data输出参数,被解密后的数据。
对VARCHAR2数据进行DES解密。
语法如下:
PROCEDURE DESDECRYPT(
input_string IN VARCHAR2,
key_string IN VARCHAR2,
decrypted_string OUT VARCHAR2
);
参数详解
- input_string输入参数,需要解密的数据。
- key_string输入参数,解密数据使用的密钥。
- decrypted_string输出参数,被解密后的数据。
对varbinary数据进行DES解密。
语法如下:
FUNCTION DESDECRYPT(
input IN VARBINARY,
key IN VARBINARY)
RETURN VARBINARY;
参数详解
- INPUT输入参数,需要解密的数据。
- KEY输入参数,解密数据使用的密钥。
返回值
返回值解密后的varbinary数据。
对VARCHAR2数据进行DES解密。
语法如下:
FUNCTION DESDECRYPT(
input_string IN VARCHAR2,
key_string IN VARCHAR2
)RETURN VARCHAR2;
参数详解
- INPUT_string输入参数,需要解密的数据。
- KEY_string输入参数,解密数据使用的密钥。
返回值
返回值解密后的VARCHAR2数据。
- DESENCRYPT
对varbinary数据进行DES加密。
语法如下:
PROCEDURE DESEncrypt(
input IN VARBINARY,
key IN VARBINARY,
encrypted_data OUT VARBINARY
);
参数详解
- INPUT输入参数,需要加密的数据。
- KEY输入参数,加密数据使用的密钥。
- eNcrypted_data输出参数,被加密后的数据。
对VARCHAR2数据进行DES加密。
语法如下:
PROCEDURE DESEncrypt(
input_string IN VARCHAR2,
key_string IN VARCHAR2,
encrypted_string OUT VARCHAR2
);
参数详解
- input_string输入参数,需要加密的数据。
- key_string输入参数,加密数据使用的密钥。
- encrypted_string输出参数,被加密后的数据。
对varbinary数据进行DES加密。
语法如下:
FUNCTION DESEncrypt(
input IN VARBINARY,
key IN VARBINARY
)RETURN VARBINARY;
参数详解
- INPUT输入参数,需要加密的数据。
- KEY输入参数,加密数据使用的密钥。
- 返回值加密后的VARBINARY数据。
对VARCHAR2数据进行DES加密。
语法如下:
FUNCTION DESEncrypt(
input_string IN VARCHAR2,
key_string IN VARCHAR2
)RETURN VARCHAR2;
参数详解
- input_string输入参数,需要加密的数据。
- key_string输入参数,加密数据使用的密钥。
返回值
返回值加密后的VARCHAR2数据。
- DESGETKEY
生成VARBINARY类型的DES加密密钥。
语法如下:
PROCEDURE DESGetKey(
seed IN VARBINARY,
key OUT VARBINARY
);
参数详解
- seed输入参数,获取DES密钥使用的种子。
- KEY输出参数,VARBINARY类型的DES加密密钥。
生成VARchar2类型的DES加密密钥。
语法如下:
PROCEDURE DESGetKey(
seed_string IN VARCHAR2,
key OUT VARCHAR2
);
参数详解
- seed_string输入参数,获取DES密钥使用的种子。
- KEY输出参数,VARchar2类型的DES加密密钥。
生成VARBINARY类型的DES加密密钥。
语法如下:
FUNCTION DESGetKey(
seed IN VARBINARY
)RETURN VARBINARY;
参数详解
- seed输入参数,获取DES密钥使用的种子。
返回值
返回VARBINARY类型的DES加密密钥。
生成VARchar2类型的DES加密密钥。
语法如下:
FUNCTION DESGetKey(
seed_string IN VARCHAR2
)RETURN VARCHAR2;
参数详解
- seed_string输入参数,获取DES密钥使用的种子。
- 返回值VARchar2类型的DES加密密钥。
- MD5
生成VARBINARY类型数据的mD5散列值。同一台机器配置,每次运行的结果一致。
语法如下:
PROCEDURE MD5(
INPUT IN VARBINARY,
CHECKSUM OUT VARBINARY
);
参数详解
- input输入参数,需要进行散列的数据。
- checksum输出参数,经MD5散列后的数据。
生成VARCHAR2类型数据的mD5散列值。同一台机器配置,每次运行的结果一致。
语法如下:
PROCEDURE MD5(
input_string IN VARCHAR2,
checksum_string OUT VARCHAR2
);
参数详解
- input_STRING输入参数,需要进行散列的数据。
- checksum_STRING输出参数,经MD5散列后的数据。
生成VARBINARY类型数据的mD5散列值。同一台机器配置,每次运行的结果一致。
语法如下:
FUNCTION MD5(
INPUT IN VARBINARY
)RETURN VARBINARY;
参数详解
- input输入参数,需要进行散列的数据。
返回值
返回MD5散列后的varbinary数据。
生成VARCHAR2类型数据的mD5散列值。同一台机器配置,每次运行的结果一致。
语法如下:
FUNCTION MD5(
input_string IN VARCHAR2
)RETURN VARCHAR2;
参数详解
- input_STRING输入参数,需要进行散列的数据。
返回值
返回MD5散列后的varchar2数据。
11.2 使用说明
- 被加解密的数据不能为空。
- DM的DES3加解密目前只支持双密钥,即WHICH默认为0的情况。
- iv加解密数据使用的初始化向量目前不使用,默认为NULL,此时采用系统默认的初始化向量。
- des3getkey和desgetkey生成加密密钥的种子seed目前不使用,因为DM用于生成密钥的环境已经配置好,只需要根据密钥的大小生成指定长度的密钥即可。
- DES和DES3加解密的块大小为8BYTES,因此用于加解密的数据必须是8的整数倍。
- DES加解密使用的密钥长度为8,多余8后的字符被忽略。
- 双密钥DES3加解密使用的密钥长度为16,多余16后的字符被忽略。
- 三密钥DES3加解密使用的密钥长度为24,多余24后的字符被忽略。
- 十六进制在DM对应的是VARBINARy数据类型,在oracle中对应的是RAW类型。
- MD5主要用途是对数据进行散列,用于校验。不同的机器生成的散列值不同。
11.3 举例说明
使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_OBFUSCATION_TOOLKIT');
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_OUTPUT');
SET SERVEROUTPUT ON; --dbms_output.put_line需要设置这条语句,才能打印出消息
例1 分别使用DES3ENCRYPT加密算法、des3decrypt解密算法对VARBINARY类型数据进行加密解密。
DECLARE
raw_input VARBINARY(128) := '74696765727469676572746967657274';
--'tigertigertigert'
raw_key VARBINARY(128) := '73636F747473636F747473636F747473';
--'scottscottscotts'
encrypted_raw VARBINARY(2048);
decrypted_raw VARBINARY(2048);
BEGIN
dbms_output.put_line('> ========= BEGIN TEST RAW DATA =========');
dbms_output.put_line('> Raw input : ' ||
raw_input);
dbms_obfuscation_toolkit.DES3Encrypt(raw_input,
raw_key, encrypted_raw );
dbms_output.put_line('> encrypted hex value : ' ||
encrypted_raw);
dbms_obfuscation_toolkit.DES3Decrypt(encrypted_raw,
raw_key, decrypted_raw);
dbms_output.put_line('> Decrypted raw output : ' ||
decrypted_raw);
dbms_output.put_line('> ');
if raw_input =
decrypted_raw THEN
dbms_output.put_line('> Raw DES Encyption and Decryption successful');
END if;
END;
/
结果:
>========= BEGIN TEST RAW DATA =========
> Raw input : 74696765727469676572746967657274
> encrypted hex value : F77BB98AF8E7F59E329C31027CAF6C98
> Decrypted raw output : 74696765727469676572746967657274
>
> Raw DES Encyption and Decryption successful
例2 分别使用DESENCRYPT加密算法、desdecrypt解密算法对VARCHAR2类型的数据进行加密、解密。本示例建库时,未指定unicode参数(unicode=0)。
DECLARE
input_string VARCHAR2(8) := 'DM123456';
key_string VARCHAR2(8) := 'PASSWORD';
encrypted_string VARCHAR2(2048);
decrypted_string VARCHAR2(2048);
BEGIN
dbms_obfuscation_toolkit.DESEncrypt(
input_string, key_string, encrypted_string );
dbms_output.put_line('> Encrypted string : ' ||
encrypted_string);
dbms_obfuscation_toolkit.DESDecrypt(
encrypted_string,
key_string,
decrypted_string);
dbms_output.put_line('> Decrypted output : ' ||
decrypted_string);
dbms_output.put_line('> ');
if input_string =
decrypted_string THEN
dbms_output.put_line('> DES Encryption and Decryption successful');
END IF;
END;
/
结果:
> Encrypted string : 盿0娒苳
> Decrypted output : DM123456
>
> DES Encryption and Decryption successful
例3 使用MD5算法对varbinary类型数据散列,查看其散列值。
DECLARE
retval varbinary(100);
input_string varbinary(100) := '74696765727469676572746967657274';
BEGIN
dbms_output.put_line('> ========= BEGIN TEST VARBINARY DATA =========');
dbms_output.put_line('> input string : '
|| input_string);
retval := DBMS_OBFUSCATION_TOOLKIT.MD5(input_string);
dbms_output.put_line( '> MD5 string output : ' ||
retval);
END;
/
结果:
> ========= BEGIN TEST VARBINARY DATA =========
> input string : 74696765727469676572746967657274
> MD5 string output : 831F2AA79221A0F8F330E43A76B53323
例4 使用DES3GETKEY,生成VARCHAR2类型的DES3加密密钥,输出加密密钥。
DECLARE
retval varchar2(100);
input_string varchar2(100) :=
'012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
BEGIN
dbms_output.put_line('> ========= BEGIN TEST STRING DATA =========');
dbms_output.put_line('> input string : '
|| input_string);
DBMS_OBFUSCATION_TOOLKIT.DES3GetKey(SEED_STRING => INPUT_STRING, KEY =>
RETVAL);
dbms_output.put_line('> decrypted string output : ' ||
retval);
END;
/
结果:
> ========= BEGIN TEST STRING DATA =========
> input string : 0123456789012345678901234567890123456789012
> 34567890123456789012345678901234567890123456789
> decrypted string output : 4OXdw4FkLe8386jQ --每次生成密码均不一样