Oracle加解密_解决编码问题_解决中文截断问题

oracle中使用des进行加密,如果oracle编码UTF-8时,会出现编码错误。要进行转码。

网上查找的代码都会出现 中文截断的现象,比如 "加密这个1",会把“1”漏了加密,这是因为使用了length()函数的原因,使用lengthb()则不会出现问题。

优化空字节处理和解密空白字符处理

编码方法如下:

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;
/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中,可以使用DBMS_CRYPTO包中的函数来实现MD5加密和解密。 MD5加密的步骤如下: 1. 将原始数据转换成二进制数据。 2. 对二进制数据进行填充,使其长度为512的整数倍。 3. 将填充后的数据分成512位的数据块,每个数据块包含16个32位的字。 4. 对每个数据块进行4轮循环运算,每轮运算包含16个步骤,每个步骤都是基于位运算和非线性函数计算得到的。 5. 将最后一个数据块的结果进行累加,并输出128位的MD5值。 下面是使用DBMS_CRYPTO包中的函数实现MD5加密和解密的示例: ``` -- MD5加密 DECLARE l_text VARCHAR2(32767) := 'hello world'; l_key RAW(2000) := UTL_RAW.CAST_TO_RAW('secret key'); l_hash RAW(16); BEGIN l_hash := DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(l_text), DBMS_CRYPTO.HASH_MD5); DBMS_OUTPUT.PUT_LINE('MD5 hash of ' || l_text || ': ' || UTL_RAW.CAST_TO_VARCHAR2(l_hash)); END; -- MD5解密(无法解密) DECLARE l_text VARCHAR2(32767) := 'hello world'; l_key RAW(2000) := UTL_RAW.CAST_TO_RAW('secret key'); l_hash RAW(16); l_decrypt RAW(2000); BEGIN l_hash := DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(l_text), DBMS_CRYPTO.HASH_MD5); DBMS_OUTPUT.PUT_LINE('MD5 hash of ' || l_text || ': ' || UTL_RAW.CAST_TO_VARCHAR2(l_hash)); -- MD5是不可逆的加密算法,无法解密。 END; ``` 需要注意的是,MD5是一种不可逆的加密算法,无法对其进行解密。因此,上面的MD5解密示例实际上是无法解密的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值