Oracle的加解密和如何调取jar包

Oracle自身加解密

1、dbms_obfuscation_toolkit 包

此包适合Oracle 10g 之前的版本,10g及之后出现了DBMS_CRYPTO 包(推荐使用)
在执行使用下面的函数的时候要注意权限,在sys账号下或者把这个包授权给其他用户也行。
下面加解密传入两个参数,(需要加密的数据,秘钥),这里的秘钥自己随意,但是要解密的话秘钥要和加密的一样。

grant execute on sys.dbms_crypto to siebel;-- siebel 是用户名

加密

CREATE OR REPLACE function
	ds_func_encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
	v_text 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;
		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(p_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;
end;

解密

CREATE OR REPLACE function ds_func_decrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
	p_text_raw RAW(20000);
	p_key_raw RAW(20000);
	v_text_raw RAW(20000);
	v_text varchar2(4000);
	v_ErrorText varchar2(500);
begin
	if(p_text is null or p_text = '' )
	then return '';
	end if;
		p_text_raw := HEXTORAW(p_text);
		p_key_raw := UTL_I18N.STRING_TO_RAW(p_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;
end;

如果是在sys账号下创建的函数,其他用户要使用的话,需要授权。授权后调用要加前缀sys.
比如:sys.ds_func_encrypt_des ()

-- 在sys账号下执行
-- 授权
grant execute on ds_func_encrypt_des to siebel;
grant execute on ds_func_decrypt_des to siebel;
-- 取消授权 使用的话siebel账号不能调用了,
revoke execute on ds_func_encrypt_des from siebel;
revoke execute on ds_func_decrypt_des from siebel;

之后直接使用就可以了,我举个例子:
在Oracle的Functionsl里面会找到你创建的函数
加密加密
解密
解密

2、DBMS_CRYPTO 包

DES3加密

授权和上面的一样(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;

加解密函数—传秘钥的函数

-- 加密  传秘钥
create or replace function YENCRYPTBYKEY(string_in in varchar2,key_in in varchar2) return raw is
	string_in_raw RAW(1024) := UTL_RAW.CAST_TO_RAW(string_in);
	key_string varchar2(32) := key_in;
	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 YDECRYPTBYKEY(raw_in in raw,key_in in varchar2) return varchar2 is
	string_out varchar2(1024);
	key_string varchar2(32) := key_in;
	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;

以上两个都可以,看使用哪一个
如果是在sys账号下创建的函数,其他用户要使用的话,需要授权。授权后调用要加前缀sys.
比如:sys.YENCRYPTBYKEY()

-- 在sys账号下执行
-- 授权
grant execute on YDECRYPTBYKEY to siebel;
grant execute on YENCRYPTBYKEY to siebel;
-- 取消授权 使用的话siebel账号不能调用了,
revoke execute on YDECRYPTBYKEY from siebel;
revoke execute on YENCRYPTBYKEY from siebel;

有无秘钥的两个方法都写出来了如下。
在这里插入图片描述
注意:
在where条件里是不能调用函数的,想要调用的话写法如下:其中dual是自带的表,Oracle都会有的,就是个空表。

where phone = (select YENCRYPTBYKEY('123456789') from dual)
aes256加密
-- 加密  AES256
create or replace function ENCRYPTBYKEY(string_in in varchar2) return raw is
  string_in_raw RAW(1024) := utl_i18n.string_to_raw(string_in,'AL32UTF8');
  key_string varchar2(32) := '72f606d870054588851dbed8e57c45fa';
  key_raw RAW(128) := utl_i18n.string_to_raw(key_string,'AL32UTF8');
  encrypted_raw RAW(1024);
begin
  encrypted_raw := dbms_crypto.Encrypt(src => string_in_raw,
                    typ => dbms_crypto.encrypt_aes256 + dbms_crypto.chain_cbc + dbms_crypto.pad_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) := '72f606d870054588851dbed8e57c45fa';
  key_raw RAW(128) := utl_i18n.string_to_raw(key_string,'AL32UTF8');
  decrypted_raw RAW(1024);
begin
  decrypted_raw := dbms_crypto.Decrypt(src => raw_in,
                    typ => dbms_crypto.encrypt_aes256 + dbms_crypto.chain_cbc + dbms_crypto.pad_pkcs5,
                    --typ => DBMS_CRYPTO.DES3_CBC_PKCS5,
                    key => key_raw);
  string_out := UTL_RAW.cast_to_varchar2(decrypted_raw);
  return string_out;
end;

Oracle调用Java的jar包

在Idea创建一个普通的Java程序即可,写完打成jar包。如果是Java程序需要调用Http接口,需要导入下面四个jar包。
在这里插入图片描述
打完的jar包放在数据库所在的服务器,进入jar包所在的目录下,需要在Oracle账号下执行。尽量把Jar包放到Oracle目录下,把文件权限改成可执行。

// 加载jar包编译出来导入Oracle数据库里面   loadjava -u 用户名/密码@连接名 -r -v -f -genmissing -s -grant public jar包
loadjava -u SYS/123456@orcl -r -v -f -genmissing -s -grant public Test.jar
// 删除jar包编译出来导入Oracle数据库里的程序   dropjava -u 用户名/密码@连接名 -r -v -f -genmissing -s -grant public jar包
dropjava -u SYS/123456@orcl -r -v -f -genmissing -s -grant public Test.jar

打开数据库执行sql语句

-- YgetName是自己定义的函数名,DsddPwd是Java类,getName是类下的一个方法
CREATE OR REPLACE FUNCTION YgetName(da VARCHAR2) RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'DsddPwd.getName(java.lang.String) return java.lang.String';

Java AES加密

//AES加解密密钥  16、24、32字节密钥,不然报错java.security.InvalidKeyException异常
	    private static String keyAes = "qfthikhbfgtjlYFGDdsAswdsMhSLdfHD";
//加密
	    public static String  AESEncryptDemo(String text, String key) throws Exception {
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
			SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
			// 初始化为加密模式,并将密钥注入到算法中
			cipher.init(Cipher.ENCRYPT_MODE, keySpec);
			// 将传入的文本加密
			byte[] encrypted = cipher.doFinal(text.getBytes());
			//生成密文
			// 将密文进行Base64编码,方便传输
			return Base64.getEncoder().encodeToString(encrypted);
		}

		//解密
		public static String AESDecryptDemo(String base64Encrypted,String key)throws Exception{
			// 创建AES解密算法实例
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
			SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
			// 初始化为解密模式,并将密钥注入到算法中
			cipher.init(Cipher.DECRYPT_MODE, keySpec);
			// 将Base64编码的密文解码
			byte[] encrypted = Base64.getDecoder().decode(base64Encrypted);
			// 解密
			byte[] decrypted = cipher.doFinal(encrypted);
			return new String(decrypted);
		}

		public static void main(String[] args) throws Exception {
			String test = "12345678912";
			String testAES = "bYfdQ3dnst+P4aUrgK5rGQ==";
			//12345678912---AES加密:---bYfdQ3dnst+P4aUrgK5rGQ==
			System.out.println(test+"---AES加密:---"+AESEncryptDemo(test,keyAes));
			//bYfdQ3dnst+P4aUrgK5rGQ==---AES解密:---12345678912
			System.out.println(testAES+"---AES解密:---"+AESDecryptDemo(testAES,keyAes));
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值