oracle中的秘钥,Oracle的DES加密(在方法中定义密钥、传递密钥并根据传递的密钥判断是否加密)...

本文介绍了一个使用 Oracle 的 DBMS_OBFUSCATION_TOOLKIT 进行 DES3 加密解密的方法。该方法在 SQL 中实现了动态密钥传递,支持对不同数据进行加密或非加密处理,并解决了对非加密数据误用解密函数导致的异常问题。

在网上查了很多,做了很小的改动

在方法中定义密钥

CREATE OR REPLACE PACKAGE PG_ENCRYPT_DECRYPT IS

IKEY VARCHAR2(8) := 'oracle9i';

FUNCTION GEN_RAW_KEY(IKEY IN VARCHAR2) RETURN RAW;

FUNCTION DECRYPT_3KEY_MODE(IVALUE IN RAW, IMODE IN PLS_INTEGER)

RETURN VARCHAR2;

FUNCTION ENCRYPT_3KEY_MODE(IVALUE IN VARCHAR2, IMODE IN PLS_INTEGER)

RETURN RAW;

END;

/

create or replace package body pg_encrypt_decrypt

is

--创建密钥

function gen_raw_key(ikey in varchar2) return raw as

rawkey raw(720):='';

begin

for i in 1..length(ikey) loop

rawkey:=rawkey||hextoraw(to_char(ascii(substr(ikey,i,1))));

end loop;

return rawkey;

end;

--解密函数

function decrypt_3key_mode(ivalue in raw,imode in pls_integer) return varchar2 as

vdecrypted varchar2(4000);

rawkey raw(720):='';

begin

rawkey:=gen_raw_key(ikey);

vdecrypted:=dbms_obfuscation_toolkit.des3decrypt(

utl_raw.cast_to_varchar2(ivalue),key_string=>rawkey,which=>imode);

return trim(vdecrypted);--注意,去除多余的空格

end;

--加密函数

function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer) return raw

is

vencrypted varchar2(4000);

vencryptedraw raw(2048);

rawkey raw(720):='';

vTmp Varchar2(24):=rpad(ivalue,24,' ');--注意由于对输入有8的倍数的要求,所以不足位者补空格

begin

rawkey:=gen_raw_key(ikey);

vencrypted:=dbms_obfuscation_toolkit.des3encrypt(vTmp,key_string=>rawkey,which=>imode);

vencryptedraw:=utl_raw.cast_to_raw(vencrypted);

return vencryptedraw;

end;

end;

/

网上说了在包中定义密钥,并对包加密,但是发现加密包后仍可看到密钥,不知道是不是自己没写对,所以绕了个路在程序中定义密钥然后传递到sql来实现对密钥的加密,并且可根据传递的密钥是否为空来决定是否执行加密解密。问题:发现对非DES加密后的字符串进行解密会触发异常,后来通过捕获异常来判断是否为加密后的字符串,如果不是加密后的字符串则返回原值来解决表中包含加密和非加密数据的问题,但是这个捕获异常的代码找不到了,改天有时间补上。

传递密钥判断是否加密

CREATE OR REPLACE PACKAGE PG_ENCRYPT_DECRYPT IS

FUNCTION GEN_RAW_KEY(IKEY IN VARCHAR2) RETURN RAW;

FUNCTION DECRYPT_3KEY_MODE(IVALUE IN VARCHAR2, IMODE IN PLS_INTEGER,IKEY IN VARCHAR2)

RETURN STRING;

FUNCTION ENCRYPT_3KEY_MODE(IVALUE IN VARCHAR2, IMODE IN PLS_INTEGER,IKEY IN VARCHAR2)

RETURN STRING;

END;

/

create or replace package body pg_encrypt_decrypt

is

--创建密钥

function gen_raw_key(ikey in varchar2) return RAW as

rawkey raw(720):='';

begin

for i in 1..length(ikey) loop

rawkey:=rawkey||hextoraw(to_char(ascii(substr(ikey,i,1))));

end loop;

return rawkey;

end;

--解密函数

function decrypt_3key_mode(ivalue in VARCHAR2,imode in pls_integer,IKEY IN VARCHAR2) return STRING as

vdecrypted varchar2(4000);

rawkey raw(720):='';

BEGIN

if IKEY IS NULL

THEN

return ivalue;

ELSE

rawkey:=gen_raw_key(ikey);

vdecrypted:=dbms_obfuscation_toolkit.des3decrypt(

utl_raw.cast_to_varchar2(ivalue),key_string=>rawkey,which=>imode);

return trim(vdecrypted);--注意,去除多余的空格

END IF;

end;

--加密函数

function encrypt_3key_mode(ivalue IN varchar2,imode in pls_integer,IKEY IN VARCHAR2) return STRING

is

vencrypted varchar2(4000);

vencryptedraw raw(2048);

rawkey raw(720):='';

BEGIN

if IKEY IS NULL

THEN

return ivalue;

ELSE

rawkey:=gen_raw_key(ikey);

vencrypted:=dbms_obfuscation_toolkit.des3encrypt(rpad(ivalue,24,' '),key_string=>rawkey,which=>imode);

vencryptedraw:=utl_raw.cast_to_raw(vencrypted);

return vencryptedraw;

END IF;

end;

end;

在sql中应用

create table users(userid varchar2(50) primary key,password varchar2(64),encrypted varchar2(64));

--创建表

INSERT INTO users VALUES ('user3','3',PG_ENCRYPT_DECRYPT.ENCRYPT_3KEY_MODE('3',1))

--插入数据(用户名,密码,加密后的密码)

select userid,password,PG_ENCRYPT_DECRYPT.DECRYPT_3KEY_MODE(encrypted,1) DECRYPTED from users;

--解密加密后的数据

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值