1、oracle中加密function
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
/*************************************************
加密函数 FUN_ENCRYPTION
入参:
V_STR 输入明文字符串
V_KEY 输入密钥字符串,长度为24字节
返回值:
V_RETURN_STR 返回密文字符串,约定返回为 16进制密文字符串
异常处理:
此函数不对任何异常做捕捉处理,请相应的程序模块对异常做捕捉处理。
加密方式:
密钥位数:AES192 DBMS_CRYPTO.ENCRYPT_AES192
连接方式:CBC DBMS_CRYPTO.CHAIN_CBC
填充方式:PKCS5 DBMS_CRYPTO.PAD_PKCS5
**************************************************/
V_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY, 'UTF8');
V_STR_RAW := UTL_I18N.STRING_TO_RAW(V_STR, 'UTF8');
-- 指定‘密钥算法’、‘工作模式’、‘填充方式’
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;
/* EXCEPTION
WHEN OTHERS THEN
RETURN SQLERRM||SQLCODE ; */
END;
2、oracle中解密function
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
/************************************************
解密函数 FUN_DECRYPTION
入参:
V_STR 输入密文字符串,约定密文为16进制字符串
V_KEY 输入密钥字符串,长度为24字节
返回值:
V_RETURN_STR 返回明文字符串
异常处理:
此函数不对任何异常做捕捉处理,请相应的程序模块对异常做捕捉处理。
加密方式:
密钥位数:AES192 DBMS_CRYPTO.ENCRYPT_AES192
连接方式:CBC DBMS_CRYPTO.CHAIN_CBC
填充方式:PKCS5 DBMS_CRYPTO.PAD_PKCS5
***************************************************/
V_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY, 'UTF8');
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, 'UTF8');
RETURN V_RETURN_STR;
/* EXCEPTION
WHEN OTHERS THEN
RETURN SQLERRM||SQLCODE ; */
END;
测试sql:
加密:SELECT ENCRYPT_FUNCTION('1', '1111aaaa') FROM DUAL
输出:A23A359C2B1946A6
解密:SELECT DECRYPT_FUNCTION('A23A359C2B1946A6', '1111aaaa') FROM DUAL
输出:1
在上述function定义中声明的:
V_TYPE := DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
与java中默认的参数一直,以保证和java跨平台的加解密可以顺利执行。上述代码是针对des算法进行的,也可进行其他的配置
Oracle 加密包 DBMS_CRYPTO 中有好多不能定义参数的常量,可参考文章:http://blog.itpub.net/post/16888/215845/
Oracle DBMS_CRYPTO
Version 10.2
General Information | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Source | {ORACLE_HOME}/rdbms/admin/dbmsobtk.sql | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Algorithm Constants |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dependencies |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Exceptions |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DECRYPT | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Decrypt crypt text data using stream or block cipher with user supplied key and optional iv Overload 1 | dbms_crypto.decrypt(src IN RAW, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
See Encrypt Overload 1 demo | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Overload 2 | dbms_crypto.decrypt(dst IN OUT NOCOPY BLOB, src IN BLOB, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Overload 3 | dbms_crypto.decrypt (dst IN OUT NOCOPY CLOB CHARACTER SET ANY_CS, src IN BLOB, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ENCRYPT | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encrypt plain text data using stream or block cipher with user supplied key and optional iv Overload 1 | dbms_crypto.encrypt(src IN RAW, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set serveroutput on DECLARE l_credit_card_no VARCHAR2(19) := '1234-5678-9012-3456'; l_ccn_raw RAW(128) := utl_raw.cast_to_raw(l_credit_card_no); l_key RAW(128) := utl_raw.cast_to_raw('abcdefgh'); l_encrypted_raw RAW(2048); l_decrypted_raw RAW(2048); BEGIN dbms_output.put_line('Original : ' || l_credit_card_no); l_encrypted_raw := dbms_crypto.encrypt(l_ccn_raw, dbms_crypto.des_cbc_pkcs5, l_key); dbms_output.put_line('Encrypted : ' || RAWTOHEX(utl_raw.cast_to_raw(l_encrypted_raw))); l_decrypted_raw := dbms_crypto.decrypt(src => l_encrypted_raw, typ => dbms_crypto.des_cbc_pkcs5, key => l_key); dbms_output.put_line('Decrypted : ' || utl_raw.cast_to_varchar2(l_decrypted_raw)); END; / | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set serveroutput on DECLARE enc_val RAW(2000); l_key RAW(2000); l_key_len NUMBER := 128/8; -- convert bits to bytes l_mod NUMBER := dbms_crypto.ENCRYPT_AES128 + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5; BEGIN l_key := dbms_crypto.randombytes(l_key_len); enc_val := dbms_crypto.encrypt( utl_i18n.string_to_raw('1234-5678-9012-3456', 'AL32UTF8'), l_mod, l_key); dbms_output.put_line(enc_val); END; / | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Overload 2 | dbms_crypto.encrypt(dst IN OUT NOCOPY BLOB, src IN BLOB, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Overload 3 | dbms_crypto.encrypt(dst IN OUT NOCOPY BLOB, src IN CLOB CHARACTER SET ANY_CS, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dbms_crypto.encrypt(UTL_RAW.CAST_TO_RAW(CONVERT('XXX','AL32UTF8')),typ,key); | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HASH | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hash source data by cryptographic hash type Overload 1 | dbms_crypto.hash(src IN RAW, typ IN PLS_INTEGER) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Overload 2 | dbms_crypto.hash(src IN BLOB, typ IN PLS_INTEGER) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Overload 3 | dbms_crypto.hash(src IN CLOB CHARACTER SET ANY_CS, typ IN PLS_INTEGER) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MAC | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Message Authentication Code algorithms provide keyed message protection Overload 1 | dbms_crypto.mac(src IN RAW, typ IN PLS_INTEGER, key IN RAW) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Overload 2 | dbms_crypto.mac(src IN BLOB, typ IN PLS_INTEGER, key IN RAW) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Overload 3 | dbms_crypto.mac(src IN CLOB CHARACTER SET ANY_CS, typ IN PLS_INTEGER, key IN RAW) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RANDOMBYTES | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Returns a raw value containing a pseudo-random sequence of bytes | dbms_crypto.randomnytes(number_bytes PLS_INTEGER) RETURN RAW; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SELECTdbms_crypto.randombytes(1) FROM dual; SELECT LENGTH(dbms_crypto.randombytes(1)) FROM dual; SELECT dbms_crypto.randombytes(28) FROM dual; SELECT LENGTH(dbms_crypto.randombytes(28)) FROM dual; SELECT dbms_crypto.randombytes(64) FROM dual; SELECT LENGTH(dbms_crypto.randombytes(64)) FROM dual; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RANDOMINTEGER | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Returns a random BINARY_INTEGER | dbms_crypto.randominteger RETURN NUMBER; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SELECTdbms_crypto.randominteger FROM dual; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RANDOMNUMBER | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Returns a random Oracle Number | dbms_crypto.randomnumber RETURN NUMBER; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SELECTdbms_crypto.randomnumber FROM dual; |