自学内容网 自学内容网

【Oracle专栏】DBMS_CRYPTO 加密包、AES加解密

 Oracle相关文档,希望互相学习,共同进步

风123456789~-CSDN博客


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.相关资料:

DBMS_CRYPTO


项目管理--相关知识   

项目管理-项目绩效域1/2-CSDN博客

项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-CSDN博客

项目管理-项目绩效域2/2_绩效域 团不策划-CSDN博客

高项-案例分析万能答案(作业分享)-CSDN博客

项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-CSDN博客

项目管理-配置管理与变更-CSDN博客

项目管理-项目管理科学基础-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博客

Oracle 更换监听端口-CSDN博客


原文地址:https://blog.csdn.net/weixin_42081167/article/details/145261372

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!