欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle进行数据库字段内容加密和解密

程序员文章站 2022-03-10 17:45:49
自定义函数的方式:-- 加密函数CREATE OR REPLACE functionds_func_encrypt_des(p_text varchar2, p_key varchar2) return varchar2 isv_text varchar2(4000);v_enc varchar2(4000);raw_input RAW(20000) ;key_input RAW(1000) ;decrypted_raw RAW(20000);v_ErrorText va....
  1. 自定义函数的方式:
-- 加密函数
CREATE OR REPLACE function
	ds_func_encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
	v_text varchar2(4000);
	v_key varchar2(4000);
	v_enc varchar2(4000);
	raw_input RAW(20000) ;
	key_input RAW(1000) ;
	decrypted_raw RAW(20000);
	v_ErrorText varchar2(500);
begin
	if(p_text is null or p_text = '' )
	then return '';
	end if;
	if(lengthb(p_key)<8)
	then v_key := lpad(p_key,8,'0');
	else v_key := p_key;
	end if;
	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(v_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;
	exception
	when others then
	--自定义异常,并捕获输出异常信息
	--v_ErrorText := 'dserror:'||SUBSTR(SQLERRM, 1, 200);
	--return v_ErrorText;
	--直接抛出异常
	RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM, TRUE);
end;

-- 调用加密函数
select ds_func_encrypt_des('我爱中国I Love China 521','ECMPMAIN') from dual;

-- 解密函数
CREATE OR REPLACE function ds_func_decrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
	v_text varchar2(4000);
	v_key varchar2(4000);
	p_text_raw RAW(20000);
	p_key_raw RAW(20000);
	v_text_raw RAW(20000);
	v_ErrorText varchar2(500);
begin
	if(p_text is null or p_text = '' )
	then return '';
	end if;
	if(lengthb(p_key)<8)
	then v_key := lpad(p_key,8,'0');
	else v_key := p_key;
	end if;
	p_text_raw := HEXTORAW(p_text);
	p_key_raw := UTL_I18N.STRING_TO_RAW(v_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));
	exception
	when others then
	--自定义异常,并捕获输出异常信息
	--v_ErrorText := 'dserror:'||SUBSTR(SQLERRM, 1, 200);
	--return v_ErrorText;
	--直接抛出异常
	RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM, TRUE);
end;

-- 调用解密函数
select ds_func_decrypt_des('60B593D9FA437A6EBCD6E84C2F12AAD22B7482E483DD2167B022FEF426D1D9CC','ECMPMAIN') from dual;

-- 加密和解密函数都有两个入参 
p_text:加密字段
p_key:加密密钥(防止加密被容易破解,最短8位 可以通过length函数判断然后进行lpad/rpad补齐,不过要记住,否则无法解密)

-- 查询Oracle版本
SELECT * FROM PRODUCT_COMPONENT_VERSION;
-- 删除加密函数
DROP FUNCTION DS_FUNC_ENCRYPT_DES;
-- 删除解密函数
DROP FUNCTION DS_FUNC_DECRYPT_DES;
  1. SQL的方式:
2.1 不使用密钥key--加密SQL
select select utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('我爱中国I Love China 521'))) from dual;
--解密SQL
select utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw('5oiR54ix5Lit5Zu9SSBMb3ZlIENoaW5hIDUyMQ=='))) from dual;
2.2 使用密钥key--加密SQL
select utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('ECMP' ||'我爱中国I Love China 521'))) from dual;
--解密SQL
select substr((select utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw('RUNNUOaIkeeIseS4reWbvUkgTG92ZSBDaGluYSA1MjE='))) from dual), LENGTH('ECMP')+1) from dual;

本文地址:https://blog.csdn.net/weixin_44624841/article/details/112648192

相关标签: oracle