参考Oracle官方文档
在Oracle使用dbms_crypto包进行加解密
首先,授权当前用户使用加解密包
在sql中运行:
connect sqlplus as sysdba
grant execute on sys.dbms_crypto to user;
dbms_crypto支持以下算法
DES,3DES(2-key and 3-ke)
AES,
MD5, MD4, SHA-1, and SHA-2 哈希算法
MAC (消息认证码,Message authentication code)
支持的完整算法见:
https://docs.oracle.com/database/121/ARPLS/d_crypto.htm#ARPLS6567
dbms_crypto包含以下子程序
加解密,哈希,随机生成整数,生成key等等
语法
解密
函数
DBMS_CRYPTO.DECRYPT(
src IN RAW,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL)
RETURN RAW;
PLS_INTEGER 算法代号包括 HASH_MD5,HASH_SH1,ENCRYPT_DES等,
完整代号见: https://docs.oracle.com/database/121/ARPLS/d_crypto.htm#ARPLS65675
注意事项:
不能直接加密varchar2类型,需要转为RAW类型后再加密
互相转换语法为:
UTL_I18N.RAW_TO_CHAR (data, 'AL32UTF8');
UTL_I18N.STRING_TO_RAW (string, 'AL32UTF8');
下同。
存储过程
DBMS_CRYPTO.DECRYPT(
dst IN OUT NOCOPY BLOB,
src IN BLOB,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL);
DBMS_CRYPT.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);
加密
函数
DBMS_CRYPTO.ENCRYPT(
src IN RAW,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL)
RETURN RAW;
存储过程
DBMS_CRYPTO.ENCRYPT(
dst IN OUT NOCOPY BLOB,
src IN BLOB,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL);
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.Hash (
src IN RAW,
typ IN PLS_INTEGER)
RETURN RAW;
DBMS_CRYPTO.Hash (
src IN BLOB,
typ IN PLS_INTEGER)
RETURN RAW;
DBMS_CRYPTO.Hash (
src IN CLOB CHARACTER SET ANY_CS,
typ IN PLS_INTEGER)
RETURN RAW;
Oracle推荐使用 SHA-1 或 or SHA-2,因为相较于MD4和MD5,它们更抵抗暴力攻击
生成二进制整数
函数
DBMS_CRYPTO.RANDOMBYTES (
number_bytes IN POSITIVE)
RETURN RAW;
存储过程
DBMS_CRYPTO.RANDOMINTEGER
RETURN BINARY_INTEGER;
随机整数
函数
DBMS_CRYPTO.RANDOMNUMBER
RETURN NUMBER;
生成0 - 2**128-1之间的整数
其它
数据类型
异常