DBMS_CRYPTO 包

dbms_CRYPTO 包提供一个对数据进行 hash 散列的方法。利用这个包,用户可以对数据进行 MD5 或 SHA1 散列。

41.1 相关方法

dbms_CRYPTO 包中包含的过程和函数如下详细介绍:

  1. HASH

对 varbinary 数据进行 hash 散列。

语法如下:

FUNCTION HASH(
	SRC           	IN    	VARBINARY,
	TYPE			IN		INT
) RETURN VARBINARY;

参数详解

  • SRC 输入参数,需要散列的数据。此处不能为空。

  • TYPE

    输入参数,使用算法,可选值 HASH_MD5、HASH_SH1。HASH_MD5 表示 MD5 信息摘要算法,HASH_SH1 表示安全散列算法 1(SHA-1)。

返回值

散列后的 varbinary 数据。

  1. ENCRYPT

对 varbinary 数据进行加密。

语法如下:

FUNCTION EnCRYPT(
	SRC       IN   varbinary,
	TYP       IN   PLS_INTEGER,
	KEY       IN   varbinary,
	IV        IN   varbinary DEFAULT NULL
) RETURN varbinary;
  • 参数详解
  • SRC 输入参数,需要加密的数据,此处不能为空。
  • TYP 输入参数,使用的算法,不能为空。
  • KEY 输入参数,加密使用的 key,不能为空。
  • IV 输入参数,加密使用的 iv,默认为空。

返回值

加密后的 varbinary 数据

  1. ENCRYPT

对 BLOB 数据进行加密。

语法如下:

PROCEDURE ENCRYPT(

PROCEDURE ENCRYPT(
	DST 			IN OUT NOCOPY 	BLOB,
	SRC 			IN 				BLOB,
	TYP 			IN 				PLS_INTEGER,
	KEY 			IN 				VARBINARY,
	IV 				IN 				VARBINARY DEFAULT NULL
);

参数详解

  • DST 输入输出参数,加密后的数据。
  • SRC 输入参数,需要加密的数据,此处不能为空。
  • TYP 输入参数,使用的算法,不能为空。
  • EKY 输入参数,加密使用的 key,不能为空。
  • IV 输入参数,加密使用的 iv,默认为空。

返回值

  1. ENCRYPT

对 CLOB 数据进行加密。

语法如下:

PROCEDURE ENCRYPT(
	DST 			IN OUT NOCOPY 	BLOB,
	SRC 			IN 				CLOB,
	TYP 			IN 				PLS_INTEGER,
	KEY 			IN 				VARBINARY,
	IV 				IN 				VARBINARY DEFAULT NULL
);

参数详解

  • DST 输入输出参数, 加密后的数据。
  • SRC 输入参数,需要加密的数据,此处不能为空。
  • TYP 输入参数,使用的算法,不能为空。
  • KEY 输入参数,加密使用的 key,不能为空。
  • IV 输入参数,加密使用的 iv,默认为空。

返回值

  1. DECRYPT

对 varbinary 数据进行解密。

语法如下:

FUNCTION DECRYPT(
	SRC 			IN 		VARBINARY,
	TYP 			IN 		PLS_INTEGER,
	KEY 			IN 		VARBINARY,
	IV 				IN 		VARBINARY DEFAULT NULL
) RETURN VARBINARY;

参数详解

  • SRC 输入参数,需要解密的数据,此处不能为空。
  • TYP 输入参数,使用算法,不能为空。
  • KEY 输入参数,解密使用的 key,不能为空。
  • IV 输入参数,解密使用的 iv,默认为空。

返回值

解密后的 varbinary 数据。

  1. DECRYPT

对 BLOB 数据进行解密。

语法如下:

PROCEDURE DECRYPT(
	DST 			IN OUT NOCOPY 	BLOB,
	SRC 			IN 				BLOB,
	TYP 			IN 				PLS_INTEGER,
	KEY 			IN 				VARBINARY,
	IV 				IN 				VARBINARY DEFAULT NULL
);

参数详解

  • DST 输入输出参数,解密后的数据
  • SRC 输入参数,需要解密的数据,此处不能为空。
  • TYP 输入参数,使用算法,不能为空。
  • KEY 输入参数,解密使用的 key,不能为空。
  • IV 输入参数,解密使用的 iv,默认为空。

返回值

  1. DECRYPT

对 BLOB 数据进行解密。

语法如下:

PROCEDURE DECRYPT(
	DST 			IN OUT NOCOPY 	CLOB,
	SRC 			IN 				BLOB,
	TYP 			IN 				PLS_INTEGER,
	KEY 			IN 				VARBINARY,
	IV 				IN 				VARBINARY DEFAULT NULL
);

参数详解

  • DST 输入输出参数,解密后的数据
  • SRC 输入参数,需要解密的数据,此处不能为空。
  • TYP 输入参数,使用算法,不能为空。
  • KEY 输入参数,解密使用的 key,不能为空。
  • IV 输入参数,解密使用的 iv,默认为空。

返回值

41.2 使用说明

  1. 使用 DBMS_CRYPTO 包时,指定的加密算法需存在于数据库中;可以通过查询系统视图 V$CIPHERS 获得;

  2. 使用时,通过使用包中的常量进行指定,如 DES_ECB 算法可以指定为 DBMS_CRYPTO.ENCRYPT_DES+DBMS_CRYPTO.CHAIN_ECB+ DBMS_CRYPTO.PAD_PKCS5;DES_ECB_NOPAD 算法可以指定为 DBMS_CRYPTO.ENCRYPT_DES+DBMS_CRYPTO.CHAIN_ECB+ DBMS_CRYPTO.PAD_NONE;

    以下为目前包中支持的常量:

    1. 支持的加密算法:ENCRYPT_DES、ENCRYPT_3DES、ENCRYPT_3DES_2KEY、ENCRYPT_AES128、ENCRYPT_AES192、ENCRYPT_AES256、ENCRYPT_RC4
    2. 支持的散列算法:HASH_MD5、HASH_SH1
    3. 支持的模式:CHAIN_ECB、CHAIN_CBC、CHAIN_CFB、CHAIN_OFB
    4. 支持的 pad 模式:PAD_PKCS5、PAD_NONE
  3. 使用加密包块加密算法时指定的 key 长度必须足够,大于等于算法所需密钥长度,超出长度部分忽略,长度不足将会报错处理。

41.3 举例说明

使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_CRYPTO');
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_OUTPUT');
SP_CREATE_SYSTEM_PACKAGES(1,'UTL_RAW');
SP_CREATE_SYSTEM_PACKAGES(1,'UTL_I18N');
SET SERVEROUTPUT ON;  //DBMS_OUTPUT.PUT_LINE需要设置这条语句,才能打印出消息

例 1 分别使用 MD5 散列算法、SHA-1 算法对 VARBINARY 类型数据进行散列。

DECLARE 
    RAW_INPUT VARBINARY(128) := '74696765727469676572746967657274'; 
    MD5_RAW VARBINARY(2048); 
    SHA1_RAW VARBINARY(2048);  
BEGIN 
    DBMS_OUTPUT.PUT_LINE('> ========= BEGIN TEST RAW DATA ========='); 
    DBMS_OUTPUT.PUT_LINE('> RAW INPUT       : ' ||            RAW_INPUT); 
    MD5_RAW := DBMS_CRYPTO.HASH(RAW_INPUT, DBMS_CRYPTO.HASH_MD5); 
    DBMS_OUTPUT.PUT_LINE('> MD5 HASH       : ' ||              MD5_RAW); 
    SHA1_RAW := DBMS_CRYPTO.HASH(RAW_INPUT, DBMS_CRYPTO.HASH_SH1); 
    DBMS_OUTPUT.PUT_LINE('> SHA1 HASH     	: ' ||             SHA1_RAW);   
END; 
/

结果如下:

> ========= BEGIN TEST RAW DATA =========
> RAW INPUT                     : 74696765727469676572746967657274
> MD5 HASH              		: 831F2AA79221A0F8F330E43A76B53323
> SHA1 HASH             		: 7E48985200C8255A8F7BFF840F9D1F2397A6C65A

例 2 使用 DES+ECB+PKCS5 算法对 VARBINARY 类型数据进行加解密。

CREATE OR REPLACE FUNCTION ENCRYPT_FUNCTION (V_STR VARCHAR2, V_KEY VARCHAR2)
    RETURN VARCHAR2 
AS 
    V_KEY_RAW      RAW (24);
    V_STR_RAW      RAW (2000);
    V_RETURN_STR   VARCHAR2 (2000);
    V_TYPE         PLS_INTEGER;
BEGIN 
    V_KEY_RAW := UTL_I18N.STRING_TO_RAW (V_KEY, 'GBK');
    V_STR_RAW := UTL_I18N.STRING_TO_RAW (V_STR, 'GBK');
    V_TYPE := 
          DBMS_CRYPTO.ENCRYPT_DES
        + DBMS_CRYPTO.CHAIN_ECB
        + DBMS_CRYPTO.PAD_PKCS5;
    V_STR_RAW := 
        DBMS_CRYPTO.ENCRYPT (SRC => V_STR_RAW, TYP => V_TYPE, KEY => V_KEY_RAW);
    V_RETURN_STR := RAWTOHEX (V_STR_RAW);
    RETURN V_RETURN_STR; 
END;
/

CREATE OR REPLACE FUNCTION DECRYPT_FUNCTION (V_STR VARCHAR2, V_KEY VARCHAR2)
    RETURN VARCHAR2
AS
    V_KEY_RAW      RAW (24);
    V_STR_RAW      RAW (2000);
    V_RETURN_STR   VARCHAR2 (2000);
    V_TYPE         PLS_INTEGER;
BEGIN
    V_KEY_RAW := UTL_I18N.STRING_TO_RAW (V_KEY, 'GBK');
    V_STR_RAW := HEXTORAW (V_STR);
    V_TYPE :=
          DBMS_CRYPTO.ENCRYPT_DES
        + DBMS_CRYPTO.CHAIN_ECB
        + DBMS_CRYPTO.PAD_PKCS5;
    V_STR_RAW :=
        DBMS_CRYPTO.DECRYPT (SRC => V_STR_RAW, TYP => V_TYPE, KEY => V_KEY_RAW);
    V_RETURN_STR := UTL_I18N.RAW_TO_CHAR (V_STR_RAW, 'GBK');
    RETURN V_RETURN_STR;
END;
/

CREATE TABLE C1
(
    A        VARCHAR2 (2000),
    SNAME    VARCHAR2 (10),
    B        INT,
    C        INT NULL,
    D        INT
);
INSERT INTO C1 (A,
                SNAME,
                B,
                C,
                D)
     VALUES (ENCRYPT_FUNCTION ('加密数据列1', 'ASDASD_123456789'),
             'A',
             102,
             104,
             1);
SELECT DECRYPT_FUNCTION(A, 'ASDASD_123456789') FROM C1;

结果如下:

SQL> SELECT DECRYPT_FUNCTION(A, 'ASDASD_123456789') FROM C1;

行号       DECRYPT_FUNCTION(A,'ASDASD_123456789')
---------- --------------------------------------
1          加密数据列1
微信扫码
分享文档
扫一扫
联系客服