本文使用Oracle内置Package加密解密方法,Oracle从10gR2版本开始支持这个包,利用这个函数可以对字段进行加解密,本包内置了多种加密解密方式(详见说明1),可以多个加密方式并行组合使用,也可独立使用,本次主要讲解RC4加密解密。
在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加密解密使用相同的密钥,因此也属于对称加密算法。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。
内置加密函数dbms_crypto.Encrypt,需要三个参数,第一个参数是raw类型的待加密字符串,第二个参数是加密方式,第三个参数是密钥,可以随机密钥,也可以固定密钥,也可以每个内容对应一个密钥,由于系统需要使用模糊匹配,本文采用固定密钥。
配置环境:包含以下两种方式,为方便多用户使用,本文采用第二种方式。
方式一、授权普通用户使用加密包。
方式二、创建加密函数到sys用户,然后授权给普通用户,为使用方便,在普通用户创建同义词。
步骤:
第一步、登录进入sysdba用户;
第二步、创建函数(函数已提供,可修改密钥,然后直接编译即可,内容见说明2),由于系统需要使用模糊匹配,故密钥已固定;
第三步、授权函数给普通用户;
grant execute on code to scott;
第四步、创建同义词;
create synonym code for sys.code;
使用示例:
1、加密
select code('12','encode') from dual;
2、解密
select code('0','decode') from dual;
3、plsql程序块
declare
a varchar2(500) := '123456';
begin
--加密
select code(a, 'encode') into a from dual;
dbms_output.put_line(a);
--解密
select code(a, 'decode') into a from dual;
dbms_output.put_line(a);
end;
说明1:Oracle内置的多种加密方式
ENCRYPT_DES:标准数据加密。有效的键长度为56位,
ENCRYPT_3DES_2KEY:修改过的3DES,用两个密钥对每个数据块加密3次。有效的键长度为112位。
ENCRYPT_3DES:对每一个数据块加密3次。有效的键长度为156位。
ENCRYPT_AES128:高级加密标准。有效的键长度为128位。
ENCRYPT_AES192: 高级加密标准。有效的键长度为192位。
ENCRYPT_AES256: 高级加密标准。有效的键长度为256位。
ENCRYPT_RC4:唯一一个流加密,它被用于加密数据流,而不是离散数据或是表态数据。
DBMS_CRYPTO包的填充常量:
PAD_PKCS5:用PKCS#5填充。
PAD_ZERO:用零填充。
PAD_NONE:不进行填充,如果假设数据块的长度正好是8个字节,则可以使用这个方法。
DBMS_CRYPT0包的连接常量:
CHAIN_CBC:密码块连接,是最常用的方法。
CHAIN_CFB:加密反馈模式。
CHAIN_ECB:电子源码书格式。
CHAIN_OFB:输入回馈模式。
说明2:自定义加密函数
create or replace function code(str varchar2, v_type varchar2)
return varchar2
is
BEGIN
if p_type = 'encode' then
return utl_raw.cast_to_varchar2(dbms_crypto.Encrypt(utl_raw.cast_to_raw(str), dbms_crypto.ENCRYPT_RC4,utl_raw.CAST_TO_RAW('test+123456')));
elsif p_type = 'decode' then
return utl_raw.cast_to_varchar2(dbms_crypto.Decrypt(utl_raw.cast_to_raw(str), dbms_crypto.ENCRYPT_RC4,utl_raw.CAST_TO_RAW('test+123456')));
else
return str;
end if;
exception
when others then
return str;
END;
/