很多时候,我们需要对数据库一些敏感信息进行加密,例如用户密码,手机号,身份证等信息,由于采用传统的应用函数加密方式,如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
发表评论 取消回复