在 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 的情况, 这样就加解密不可互逆.
纯属学习, 错误之处, 请指出.
来源: http://www.jianshu.com/p/0b4a82ce5e80