【Oracle专栏】DBMS_CRYPTO 加密包、AES加解密
Oracle相关文档,希望互相学习,共同进步
1.概要
Oracle内置的 DBMS_CRYPTO 加密包功能非常强大,它提供了许多加密相关函数,包括对称加密、非对称加密、散列等。以下主要针对对称加密详细说明:
对称加密:首先定义一个明文和一个密钥,然后使用DBMS_CRYPTO.ENCRYPT函数对明文进行加密。
function encrypt(scr in raw, --需要加密的内容,但需转成raw类型
typ in pls_integer, --加密类型,由dbms_crypto定义
key in raw, --即加密密钥,可用固定字符生成密钥,解密时需要
iv in raw,default null)。
加密后的数据以RAW类型返回,可以使用RAWTOHEX函数将其转换为十六进制表示的字符串进行输出。以下代码中,inputtext 为待加密字符串,key为加密密钥,加密方式使用AES256进行加密(密钥位数:AES256 DBMS_CRYPTO.ENCRYPT_AES256
连接方式:CBC DBMS_CRYPTO.CHAIN_CBC
填充方式:PKCS5 DBMS_CRYPTO.PAD_PKCS5)
-- 对称加密 DECLARE inputtext VARCHAR2(100) := 'Hello!'; key RAW(16) := UTL_RAW.CAST_TO_RAW('MySecretKey123'); encrypted_data RAW(2048); BEGIN encrypted_data := DBMS_CRYPTO.ENCRYPT( src => UTL_RAW.CAST_TO_RAW(inputtext), typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, key => key ); DBMS_OUTPUT.PUT_LINE('Encrypted Data: ' || RAWTOHEX(encrypted_data)); END; /
注意:使用前需要sysdba 赋予权限
grant execute on sys.dbms_crypto to user;
2. 验证
2.1 aes加密
aes字符串加密:
--#加密 create or replace function feng_encrypt(p_input VARCHAR2) RETURN varchar2 IS --这里注意位数,128是16位key,256需要32位key p_key varchar2(16):= 'thisisnhtcaespwd'; raw_key raw(300):= utl_i18n.string_to_raw(p_key,'UTF8'); l_src_data raw(300):= utl_i18n.string_to_raw(p_input,'UTF8'); l_encval raw(2000); vAesString varchar2(200); BEGIN vAesString := p_input; --if length(trim(p_input)) >= 7 and length(p_input) <= 18 then l_encval := dbms_crypto.encrypt ( src => l_src_data, typ => dbms_crypto.encrypt_aes128 + dbms_crypto.chain_ecb + dbms_crypto.pad_pkcs5, key => raw_key, iv => raw_key ); vAesString := utl_raw.cast_to_varchar2( utl_encode.base64_encode( rawtohex (l_encval ) ) ); --end if; RETURN vAesString; end;
查询:
select feng_encrypt('142733196902275413') from dual;
结果截图:
2.2 aes解密
aes字符串解密:
create or replace function feng_encrypt(p_input VARCHAR2) RETURN varchar2 IS --这里注意位数,128是16位key,256需要32位key p_key varchar2(16):= 'thisisnhtcaespwd'; raw_key raw(300):= utl_i18n.string_to_raw(p_key,'UTF8'); l_src_data raw(300):= utl_i18n.string_to_raw(p_input,'UTF8'); l_encval raw(2000); vAesString varchar2(200); BEGIN vAesString := p_input; if length(trim(p_input)) >= 7 and length(p_input) <= 18 then l_encval := dbms_crypto.encrypt ( src => l_src_data, typ => dbms_crypto.encrypt_aes128 + dbms_crypto.chain_ecb + dbms_crypto.pad_pkcs5, key => raw_key, iv => raw_key ); vAesString := utl_raw.cast_to_varchar2( utl_encode.base64_encode( rawtohex (l_encval ) ) ); end if; RETURN vAesString; end;
查询:
select feng_decrypt ('8BGbDm2e7yfITD2WCvHZ17HhypYDhuQybBdIH1bNunA=') from dual;
结果截图:
实验验证:ok
select feng_decrypt (feng_encrypt('142733196902275413')) from dual;
3.知识总结
1)RAW 数据类型
RAW数据类型用于存储二进制数据和任何面向字节的数据。RAW 可变长度二进制类型,不受字符集的影响,目前已被LOB类型替代,结构非常像VARCHAR2,做为COLUMN 最大2000字节,做为变量32767个字节。
RAW 声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。
LONG RAW 作为数据库列最大存储2G字节的数据,作为变量最大32760字节。
不能直接将字符串值分配给RAW 数据类型的变量。如果需要,可以使用utlraw包和cast_to_raw函数实现。
UTL_RAW.CAST_TO_RAW:直接把字符串中每个字符的ASCII码存放到RAW类型的字段中, 即会转换为传入的字符串的每一个字符的ASCII码的16进制。
HEXTORAW:把16进制转为RAW,该参数是把传入的字符串直接当16进制字符,如果不是有效字符会报错。
代码:
SELECT utl_raw.cast_to_raw('1') from dual;
结果截图:
2)rawtohex
RAWTOHEX函数:用于将RAW类型(二进制数据)的数据 转为16进制的人类可读的字符串。返回的十六进制字符串的长度是原始RAW数据长度的两倍,因为每个RAW字节都被转换为两个十六进制字符。
代码:
select rawtohex('31') from dual;
截图:
3)16进制、2进制、10进制
十进制表示常用的十进制数,二进制表示使用0和1表示的二进制数,十六进制表示使用0-9和A-F表示的十六进制数。
1到15的十进制、二进制和十六进制的值如下:
十进制D:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
二进制B:0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 (8421)
十六进制H:1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
4)utl_encode.base64_encode
UTL_ENCODE包提供编码数据及解码数据的方法。
BASE64_ENCODE函数:将RAW字符串或TEXT字符串转换为Base64格式的字符串。
BASE64_DECODE函数:将Base64格式的字符串进行解码,转换为编码前的初始值。
代码:
--编码
select utl_encode.base64_encode('F0119B0E6D9EEF27C84C3D960AF1D9D7B1E1CA960386E4326C17481F56CDBA70') from dual;
--解码
select utl_encode.base64_decode('38424762446D326537796649544432574376485A313748687970594468755179624264494831624E756E413D') from dual;
结果截图:
5)utl_raw.cast_to_varchar2
1.UTL_RAW.CAST_TO_RAW:该函数按照缺省字符集(一般为GB2312),将VARCHAR2字符串转换为RAW,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中。
2.UTL_RAW.CAST_TO_VARCHAR2:该函数按照缺省字符集合(一般为GB2312),将RAW转换为VARCHAR2。
代码:
--二进制 转为字符串:
select utl_raw.cast_to_varchar2
('38424762446D326537796649544432574376485A313748687970594468755179624264494831624E756E413D') from dual;
--字符串 转为二进制:
select utl_raw.cast_to_raw
('8BGbDm2e7yfITD2WCvHZ17HhypYDhuQybBdIH1bNunA=') from dual;
结果截图:
4.相关资料:
项目管理--相关知识
项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-CSDN博客
项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-CSDN博客
项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-CSDN博客
Oracle其他文档,希望互相学习,共同进步
Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-CSDN博客
oracle 跟踪文件--审计日志_oracle审计日志-CSDN博客
ORA-12899报错,遇到数据表某字段长度奇怪现象:“Oracle字符型,长度50”但length查却没有50_varchar(50) oracle 超出截断-CSDN博客
EXP-00091: Exporting questionable statistics.解决方案-CSDN博客
原文地址:https://blog.csdn.net/weixin_42081167/article/details/145261372
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!