#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
pdf-btn 下载文档
copy-btn 复制链接