oracle内置加解密函数dbms_crypto的应用

       很多时候,我们需要对数据库一些敏感信息进行加密,例如用户密码,手机号,身份证等信息,由于采用传统的应用函数加密方式,如md5这种,都是公开解密算法,所以安全性不够高,下面方案将采用Oracle数据库dbms_crypto包进行数据加密,密钥可以自定义保存在数据库,并且可对其定义进行二次加密,安全性高,对于对敏感信息保密性要求较高的业务,可以考虑此方案!

1,赋权给相应用户(使用加解密函数的用户)创建同义词权限:

grant create synonym  to mbs7_tms;

2,创建同义词(这里假设已存在sys.DECRYPTBYKEY加密函数,下面有创建该加密函数的步骤):

create synonym DECRYPTBYKEY for sys.DECRYPTBYKEY;

另:加密函数用:sys.ENCRYPTBYKEY需赋权:

grant 

GRANT EXECUTE ON  SYS.dbms_crypto  TO mbs7_tms;

GRANT EXECUTE ON  sys.ENCRYPTBYKEY  TO mbs7_tms;

GRANT EXECUTE ON  sys.DECRYPTBYKEY  TO mbs7_tms;

create synonym DECRYPTBYKEY for sys.DECRYPTBYKEY;

加密封装:sys.ENCRYPTBYKEY

解密封装:DECRYPTBYKEY

下面是创建加密函数的方法(sys用户下创建):

create or replace function ENCRYPTBYKEY(string_in in varchar2) return raw is

        string_in_raw RAW(1024) := UTL_RAW.CAST_TO_RAW(string_in);

        key_string varchar2(32) := 'molaerpfadfaerewrewrewrewrf87980';

       key_raw RAW(128) := UTL_RAW.CAST_TO_RAW(key_string);

         encrypted_raw RAW(1024);

      begin

          encrypted_raw := dbms_crypto.Encrypt(src => string_in_raw,

                                              typ => DBMS_CRYPTO.DES3_CBC_PKCS5,

                                              key => key_raw);

       return encrypted_raw;

     end;

创建解密函数的方法:

create or replace function DECRYPTBYKEY(raw_in in raw) return varchar2 is

          string_out varchar2(1024);

          key_string varchar2(32) := 'molaerpfadfaerewrewrewrewrf87980';   

          key_raw RAW(128) := UTL_RAW.CAST_TO_RAW(key_string);

          decrypted_raw RAW(1024);

        begin

         decrypted_raw := dbms_crypto.Decrypt(src => raw_in,

                                              typ => DBMS_CRYPTO.DES3_CBC_PKCS5,

                                               key => key_raw);

      string_out := UTL_RAW.cast_to_varchar2(decrypted_raw);

       return string_out;

end;

注意:这里加解密函数都采用自定义密钥key_string varchar2(32) := 'molaerpfadfaerewrewrewrewrf87980';可自定义密钥!

由于加解密函数的定义都是明文方式存储在数据库中,这个时候可对其代码定义进行二次加密:

直接用wrap加密加解密函数定义(这里把上面的sys.ENCRYPTBYKEY临时存储为1.sql):

1 wrap iname=1.sql oname=2.sql

其中1为原加密函数定义,2为加密后的加密函数定义;

以sys登录数据库用加密后的函数定义创建加密函数:

SQL>@2.sql;

2 用同样的方法加密解密函数定义(这里把上面的sys.DECRYPTBYKEY临时存储为3.sql):

wrap iname=3.sql oname=4.sql

其中3为原解密函数定义,4为加密后的解密函数定义;

以sys登录数据库用加密后的函数定义创建加密函数:

SQL>@4.sql;

给使用加解密函数的用户赋权:

1加密函数赋权:

GRANT EXECUTE ON  SYS.dbms_crypto  TO user1;

GRANT EXECUTE ON  sys.ENCRYPTBYKEY  TO user1;

2解密函数赋权:

GRANT EXECUTE ON  sys.DECRYPTBYKEY  TO user1;

grant create synonym  to user1;

用user1登录数据库,并建立同义词:

create synonym DECRYPTBYKEY for sys.DECRYPTBYKEY;

用法简介:

SQL> create table t1(id raw(100));

Table created

加密:

SQL> insert into t1 values(sys.encryptbykey('abc'));

1 row inserted

SQL> select * from t1;

ID

--------------------------------------------------------------------------------

05B436341AAE7FAE

解密:

SQL> select DECRYPTBYKEY(id) from t1;

DECRYPTBYKEY(ID)

--------------------------------------------------------------------------------

abc