#DBMS_CRYPTO
DBMS_CRYPTO包提供了一组内置的函数,用于数据进行加密和解密。
# DECRYPT
DBMS_CRYPTO.DECRYPT(
src IN RAW,
typ IN INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL)
RETURN RAW;
该函数使用流密码或块密码,并使用用户提供的密钥和可选的 IV(初始化向量)对 RAW 数据进行解密。
参数 | 描述 |
---|---|
src | 要解密的RAW数据。 |
typ | 要使用的流密码或块密码类型。 |
key | 用于解密的key。 |
iv | 用于块密码的可选初始化向量。 |
本函数的主要规则为:
- src数据必须是RAW类型,或者能够隐式转换为RAW类型的类型。src不能为NULL,可以为空,为空时返回空。
- typ必须为INTEGER类型,不能为空,使用时,通过使用包中的常量进行指定,且必须指定加密类型、分组加密模式、填充模式。
- 加密类型目前支持DBMS_CRYPTO.ENCRYPT_AES128、DBMS_CRYPTO.ENCRYPT_DES、DBMS_CRYPTO.ENCRYPT_3DES、DBMS_CRYPTO.ENCRYPT_3DES_2KEY,分组加密模式支持DBMS_CRYPTO.CHAIN_CBC,填充模式支持DBMS_CRYPTO.PAD_NONE、DBMS_CRYPTO.PAD_PKCS7。
- key数据必须是RAW类型,或者能够隐式转换为RAW类型的类型,不能为NULL。
- iv数据必须是RAW类型,或者能够隐式转换为RAW类型的类型,默认为NULL。
- 填充模式为DBMS_CRYPTO.PAD_NONE时,需要保证src必须为分组加密的块大小的整数倍,key必须为分组加密的块大小。
示例
DECLARE
l_input RAW(100) := HEXTORAW('97ED8C1EE5846E622BEB372600EEA263');
l_key RAW(30) := HEXTORAW('01234567899876543210012345678912');
l_decrypt RAW(2000);
BEGIN
l_decrypt := DBMS_CRYPTO.DECRYPT(
src => l_input,
typ => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_NONE,
key => l_key,
iv => NULL
);
DBMS_OUTPUT.PUT_LINE('decrypt value: ' || l_decrypt);
END;
/
--result
decrypt value: 01234567899876543210012345678912
DECLARE
l_input RAW(100) := HEXTORAW('BE924F9786C4A65D65F63A99C03D7401');
l_key RAW(30) := HEXTORAW('30313233343536373839414243444546');
l_decrypt RAW(2000);
BEGIN
l_decrypt := DBMS_CRYPTO.DECRYPT(
src => l_input,
typ => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS7,
key => l_key,
iv => NULL
);
DBMS_OUTPUT.PUT_LINE('decrypt value: ' || l_decrypt);
END;
/
--result
decrypt value: 596F757253656372657444617461
# ENCRYPT
DBMS_CRYPTO.ENCRYPT(
src IN RAW,
typ IN INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL)
RETURN RAW;
该功能使用用户提供的密钥和可选的IV(初始化向量),使用流密码或块密码对RAW数据进行加密。
参数 | 描述 |
---|---|
src | 要加密的RAW数据。 |
typ | 要使用的流密码或块密码类型。 |
key | 用于加密的key。 |
iv | 用于块密码的可选初始化向量。 |
本函数的主要规则为:
- src数据必须是RAW类型,或者能够隐式转换为RAW类型的类型。src不能为NULL,可以为空,为空时返回空。
- typ必须为INTEGER类型,不能为空,使用时,通过使用包中的常量进行指定,且必须指定加密类型、分组加密模式、填充模式。
- 加密类型目前支持DBMS_CRYPTO.ENCRYPT_AES128、DBMS_CRYPTO.ENCRYPT_DES、DBMS_CRYPTO.ENCRYPT_3DES、DBMS_CRYPTO.ENCRYPT_3DES_2KEY,分组加密模式支持DBMS_CRYPTO.CHAIN_CBC,分组加密模式支持DBMS_CRYPTO.CHAIN_CBC,填充模式支持DBMS_CRYPTO.PAD_NONE、DBMS_CRYPTO.PAD_PKCS7。
- key数据必须是RAW类型,或者能够隐式转换为RAW类型的类型,不能为NULL。
- iv数据必须是RAW类型,或者能够隐式转换为RAW类型的类型,默认为NULL。
- 填充模式为DBMS_CRYPTO.PAD_NONE时,需要保证src必须为分组加密的块大小的整数倍,key必须为分组加密的块大小。
示例(HEAP表)
DECLARE
l_input RAW(100) := HEXTORAW('01234567899876543210012345678912');
l_key RAW(16) := HEXTORAW('01234567899876543210012345678912');
l_encrypt RAW(2000);
BEGIN
l_encrypt := DBMS_CRYPTO.ENCRYPT(
src => l_input,
typ => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_NONE,
key => l_key,
iv => NULL
);
DBMS_OUTPUT.PUT_LINE('Encrypt value: ' || l_encrypt);
END;
/
--result
Encrypt value: 97ED8C1EE5846E622BEB372600EEA263
DECLARE
l_input RAW(100) := HEXTORAW('596F757253656372657444617461');
l_key RAW(30) := HEXTORAW('30313233343536373839414243444546');
l_iv RAW(30) := HEXTORAW('30313233343536373839414243444546');
l_encrypt RAW(2000);
BEGIN
l_encrypt := DBMS_CRYPTO.ENCRYPT(
src => l_input,
typ => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS7,
key => l_key,
iv => l_iv
);
DBMS_OUTPUT.PUT_LINE('Encrypt value: ' || l_encrypt);
END;
/
--result
Encrypt value: 05B75EB2703F4CD71A02CA7A6EFB4640
# Hash
DBMS_CRYPTO.Hash (
src IN RAW,
typ IN INTEGER)
RETURN RAW;
将RAW类型数据进行单向散列。
参数 | 描述 |
---|---|
src | 要哈希散列的源数据。 |
typ | 使用的哈希算法。 |
本函数的主要规则为:
- src数据必须是RAW类型,或者能够隐式转换为RAW类型的类型。src不能为NULL,可以为空,为空时返回空。
- typ必须为INTEGER类型,不能为空,使用时,通过使用包中的常量进行指定。
- 哈希类型目前支持DBMS_CRYPTO.HASH_SH256、DBMS_CRYPTO.HASH_MD5。
示例
DECLARE
l_input RAW(100) := HEXTORAW('596F757253656372657444617461');
l_hash RAW(100);
BEGIN
l_hash := DBMS_CRYPTO.HASH(
src => l_input,
typ => DBMS_CRYPTO.HASH_SH256
);
DBMS_OUTPUT.PUT_LINE('Hash value: ' || l_hash);
END;
/
--result
Hash value: F27F3BE39C013B4E7ABE2130AFC996B1CFF32E18AED9EB206162CCE29F763F1C