Oracle 函数加密

作者: 落日种子 | 来源:发表于2018-05-26 12:21 被阅读0次

    在oracle中,可以使用其自带的加密函数,使得应用部分不必关心加密的细节,只需要在sql语句中对对应的字段进行加解密。

    Oracle支持AES和DES等加密方法,AES加密方法相对比较安全,但是des基本可以满足要求。

    Oracle加密存储过程如下:

    CREATE OR REPLACE function 

    encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is

    v_text varchar2(4000);

    v_enc varchar2(4000);

    raw_input RAW(128) ;

    key_input RAW(128) ;

    decrypted_raw RAW(2048);

    begin

    dbms_output.put_line(p_text);

    v_text := rpad( p_text, (trunc(lengthb(p_text)/8)+1)*8, chr(0));

    dbms_output.put_line(v_text);

    raw_input := UTL_I18N.STRING_TO_RAW(v_text,'ZHS16GBK');

    key_input := UTL_I18N.STRING_TO_RAW(p_key,'ZHS16GBK');

    dbms_obfuscation_toolkit.DESEncrypt(input => raw_input,key => key_input,encrypted_data =>decrypted_raw);

    v_enc := rawtohex(decrypted_raw);

    dbms_output.put_line(v_enc);

    return v_enc;

    end;

    /

    对应的解密存储过程如下:

    CREATE OR REPLACE function WPGL.decrypt_des(p_text varchar2, p_key varchar2) return varchar2 is

    p_text_raw RAW(2000);

    p_key_raw RAW(2000);

    v_text_raw RAW(2000);

    v_text varchar2(2000);

    begin

    if(p_text  is null or p_text = '' )

    then return '';

    end if;

    p_text_raw := HEXTORAW(p_text);

    p_key_raw := UTL_I18N.STRING_TO_RAW(p_key, 'ZHS16GBK');

    dbms_obfuscation_toolkit.DESDECRYPT(input => p_text_raw, key =>p_key_raw, decrypted_data=> v_text_raw);

    v_text := UTL_I18N.RAW_TO_CHAR(v_text_raw, 'ZHS16GBK');

    dbms_output.put_line(v_text);

    return rtrim(v_text,chr(0));

    end;

    /

    加密函数中,用到 lengthb 而不是length,是防止中文与ase码长度不一,不然,加密时会丢失部分中文信息。

    解密函数 中,最后return时,不是直接把字符串返回去,而是使用 rtrim(v_text,chr(0)) 方法,如果直接返回字符串的话,正常的显示是没有问题的,但是后面会有不可显示字符 asc码为0的情况,这样就加解密不可互逆。

    纯属学习,错误之处,请指出。

    相关文章

      网友评论

        本文标题:Oracle 函数加密

        本文链接:https://www.haomeiwen.com/subject/lytujftx.html