oracle加密可以跟java一致吗,在GBase 8s上使用java udr实现Oracle兼容的加密解密功能...

最近碰到客户从Oracle迁移到GBase 8s使用到字段加密解密功能,使用到了Utl_raw.cast_to_varchar2、Utl_raw.cast_to_raw、Utl_encode.base64_decode、dbms_obfuscation_toolkit.desdecrypt等oracle特有函数,这些与GBase 8s自带的加密函数DECRYPT_CHAR并不兼容。客户暂时只能考虑使用程序加密的方式实现。

对于GBase 8s数据库来说,其实也可以使用自定义例程(UDR,可以是基于C,也可能是基于Java)的方式来扩展函数使用。以下我们就以这个加密解密功能来说明Java UDR的创建与使用。

使用的操作系统:CentOS7.6 64bit

数据库版本:GBase8sV8.7_2.0.1a2_2

GBase 8s自带的JRE版本是1.6,故创建java程序时,特性需要与java 1.6版本兼容。在java 1.6中,我们使用到了commons-codec-1.9.jar。

0, 创建并配置sbspace空间onspaces -c -S sbspace01 -p /data/gbase/sbspace01 -o 0 -s 1024000

更新ONCONFIG配置文件中SBSPACENAME为sbspace01SBSPACENAME sbspace01

1,创建java类JUDREncrypt,实现encrypt_base64out及decrypt_base64in功能,测试通过/**

* Base on: Java 1.6 & apache commons-codec-1.9

*/

import java.nio.charset.Charset;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

import org.apache.commons.codec.binary.Base64;

public class JUDREncrypt {

public static String charset = "GBK";

public static void main(String[] args) {

// encrypt_base64: text = 1, key = GBase8sv8.7_2.0.1a2_2

String key = "GBase8sv8.7_2.0.1a2_2";

String encrypttext = encrypt_base64out("中文输入", key);

System.out.println("Encrypt text: " + encrypttext);

System.out.println("Decrypt text: " + decrypt_base64in("ERPHYYO4/BQ=", "GBase8sv8.7_2.0.1a2_2"));

}

// 加密

public static String encrypt_base64out(String p_text, String p_key) {

try {

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

DESKeySpec keySpec = new DESKeySpec(p_key.getBytes(Charset.forName(charset)));

SecretKey myDesKey = keyFactory.generateSecret(keySpec);

Cipher desCipher = Cipher.getInstance("DES/ECB/NoPadding");

desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);

byte[] textEncrypted = desCipher.doFinal(padding(p_text).getBytes());

Base64 encoder = new Base64();

byte[] byte_text = encoder.encode(textEncrypted);

return new String(byte_text,charset);

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

public static String decrypt_base64in(String p_text, String p_key) {

try {

Base64 decoder = new Base64();

byte[] byte_text = decoder.decode(p_text.getBytes(Charset.forName(charset)));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

DESKeySpec keySpec = new DESKeySpec(p_key.getBytes(Charset.forName(charset)));

SecretKey myDesKey = keyFactory.generateSecret(keySpec);

Cipher desCipher = Cipher.getInstance("DES/ECB/NoPadding");

desCipher.init(Cipher.DECRYPT_MODE, myDesKey);

byte[] textDecrypted = desCipher.doFinal(byte_text);

return rtrim(new String(textDecrypted,charset));

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

public static String rtrim(String str,String del) {

if(del.equals(null)) {

del = "`";

}

int strlen = str.length();

for(int i = strlen - 1; i > -1; i--) {

if(! str.substring(i, i+1).equals(del)) {

return str.substring(0,i+1);

}

}

return str;

}

public static String rtrim(String str) {

String del = "`";

int strlen = str.length();

for(int i = strlen - 1; i > -1; i--) {

if(! str.substring(i, i+1).equals(del)) {

return str.substring(0,i+1);

}

}

return str;

}

public static String padding(String str,String pad) {

if (str.getBytes().length % 8 == 0) {

return str;

}

if(pad.equals(null)) {

pad = "`";

}

int padlen = 8 - str.getBytes().length % 8;

String padstr = "";

if(padlen > 0 & padlen < 8) {

for(int i = 0; i < padlen; i++) {

padstr = padstr + pad;

}

}

return str + padstr;

}

public static String padding(String str) {

if (str.getBytes().length % 8 == 0) {

return str;

}

String pad = "`";

int padlen = 8 - str.getBytes().length % 8;

String padstr = "";

if(padlen > 0 & padlen < 8) {

for(int i = 0; i < padlen; i++) {

padstr = padstr + pad;

}

}

return str + padstr;

}

}

2,打包成jar(使用jdk 1.6版本)javac JUDREncrypt.java

jar -cf judrencrypt-1.4.jar JUDREncrypt.class

3,将jar包放置到数据库服务器上($GBASEDBTDIR=/opt/gbase)

judrencrypt-1.4.jar 放置到$GBASEDBTDIR/java_udr目录下

commons-codec-1.9.jar 放置到$GBASEDBTDIR/extend/krakatoa目录下。

4,设置数据库的JVP环境

ONCONFIG配置文件中修改

1)VPCLASS开启jvp,用于处理Java UDRVPCLASS jvp,num=1

2)JVPARGS增加-Dfile.encoding=GBKJVPARGS -Dcom.ibm.tools.attach.enable=no;-Dfile.encoding=GBK

3)JVPCLASSPATH增加commons-codec-1.9.jar的路径

$GBASEDBTDIR/extend/krakatoa/commons-codec-1.9.jar

使之变成为JVPCLASSPATH $GBASEDBTDIR/extend/krakatoa/krakatoa.jar:$GBASEDBTDIR/extend/krakatoa/jdbc.jar:$GBASEDBTDIR/extend/krakatoa/commons-codec-1.9.jar

重启数据库生效,onstat -g glo中应有jvp虚拟处理器。

5,在需要的数据库中注册jarexecute procedure install_jar("file:/opt/gbase/java_udr/judrencrypt-1.4.jar", "JUDREncrypt");

install_jar的参数:jar所在的绝对路径,安装后的名称。

6,创建相应的例程-- 解密

drop function if exists decrypt_base64in;

create function decrypt_base64in(varchar(254),varchar(254))

returns varchar(254) with (not variant)

external name 'JUDREncrypt:JUDREncrypt.decrypt_base64in(java.lang.String,java.lang.String)'

language java;

--加密

drop function if exists encrypt_base64out;

create function encrypt_base64out(varchar(254),varchar(254))

returns varchar(254) with (not variant)

external name 'JUDREncrypt:JUDREncrypt.encrypt_base64out(java.lang.String,java.lang.String)'

language java;

其中function中的decrypt_base64in(lvarchar,lvarchar)应与Java中的定义相对应;

external name 为java中的名称,格式为:安装后的名称:java类名.方法

完成即可正常使用新创建的encrypt_base64in(lvarchar,lvarchar)及decrypt_base64in(lvarchar,lvarchar)> execute function encrypt_base64out("1","GBase8sv8.7_2.0.1a2_2");

(expression) wfjaoFa+Fng=

1 row(s) retrieved.

> execute function decrypt_base64in("wfjaoFa+Fng=","GBase8sv8.7_2.0.1a2_2");

(expression) 1

1 row(s) retrieved.

7, 修改Java UDR例程的操作

修改指定注册名称的对应的jar新路径或者名称

如:JUDREncrypt使用新的jar包替换掉之前的execute procedure replace_jar("file:/opt/gbase/java_udr/judrencrypt-1.4.jar", "JUDREncrypt");

8,删除Java UDR例程的操作

删除对应的函数drop function decrypt_base64in;

drop function encrypt_base64out;

移除对应的注册的jarexecute procedure remove_jar("JUDREncrypt");

只需要注册的名称。

编译好的jar(JDK1.6)

注:本文已在2020-05-15更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode MySQL 1127. 用户购买平台 *

文章目录1. 题目2. 解题1. 题目 支出表: Spending ---------------------- | Column Name | Type | ---------------------- | user_id | int | | spend_date | date | | platform | enum | | amount | int | ---------------------- 这张表记…

生活中常见的操作系统

一、 操作系统 1.1 操作系统概念 操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理和控制计算机硬件与软件资源的计算机程序&#xff0c;是直接运行在“裸机”上的最基本的系统软件&#xff0c;任何其他软件都必须在操作系统的支持下才能运行。 操…

Example3_1

import java.util.*;public class Example3_1{ public static void main(String args[]){ Scanner readernew Scanner(System.in); System.out.println("输入待移位的int型整数:"); int xreader.nextInt(); System.out.println("输入移位量:"); int n…

oracle事务重要属性,Oracle中的事务(2)--属性和隔离级别

事务的属性1.只读属性(read only)只读事务&#xff0c;只执行查询操作&#xff0c;而不允许执行DML(增、删、改)操作&#xff0c;使用只读事务&#xff0c;可以让用户只取到某个时间点的数据。假如有一个机票代售点&#xff0c;有一个管理员想在一个时间点进行统计总共卖出去的…

edge.js架起node.js和.net互操作桥梁

今天要介绍的是edge.js这个github上刚兴起的开源项目&#xff0c;它可以让node.js和.net之间在in-process下互操作。.net版本在4.5及以上&#xff0c;因为.net4.5带来的Task&#xff0c;asyn&#xff0c;await关键字和node.js的Event模型正好匹配。如果你感兴趣的话&#xff0c…

linux历史追溯

1. Linux 历史早在 linux 出现之前的 20 年(大约在 20 世纪 70 年代)&#xff0c;就有一个相当稳定而成熟的操作系统存在了。那就是 Linux 的老大哥”Unix”。那么 Linux 和 Unix 有什么关系呢&#xff1f;Linux 的内核是由 Linus Torvalds 在 1991 年的时候给开发出来的&#…

php获取当前世界,php获取网站alexa世界流量排名代码

gooood个人博客网站phpfunction getAlexaRank ($Domain){$line "";$data "";$URL "http://data.alexa.com/data/?cli10&datsnba&url". $Domain ;$fp fopen ($URL ,"r");if ($fp ){while (!feof ($fp )){$line fgets ($f…

“函数调用的左操作数”的理解

参考下面这个网址中两段话&#xff0c;对《C Primer》中的这句话“函数调用的左操作数”进行理解&#xff1a; http://www.caole.net/diary/lvalue.html “C中引入了引用类型(reference type),引用总是引用到某一对象或者函数上&#xff0c;因此当我们使用引用时,相当于对其引用…

LeetCode MySQL 180. 连续出现的数字(cast)

文章目录1. 题目2. 解题1. 题目 编写一个 SQL 查询&#xff0c;查找所有至少连续出现三次的数字。 --------- | Id | Num | --------- | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | --------- 例如&#xff0c;给定上面的 L…

linux应用领域

Linux 应用领域个人桌面领域此领域是传统 linux 应用最薄弱的环节&#xff0c;传统 linux 由于界面简单、操作复杂、应用软件少的缺点&#xff0c;一直被 windows 所压制&#xff0c;但近些年来随着 ubuntu、fedora 等优秀桌面环境的兴起&#xff0c;同时各大硬件厂商对其支持…

怎么在linux下使用ftp服务器,怎么在Linux下建立安全的FTP服务器?

怎么在Linux下建立安全的FTP服务器&#xff1f;2018-08-31 15:53分享人&#xff1a;老牛学习Linux系统时&#xff0c;你可能会遇到网络服务的问题&#xff0c;这里将介绍linux FTP服务器安全及DHCP服务的实现的解决方法&#xff0c;在这里拿出来和大家分享一下。Linux系统相对于…

Linux基本操作指南

Linux 操作1 Linux 文件和目录Windows 和 Linux 文件系统在 windows 平台下&#xff0c;打开“计算机”&#xff0c;我们看到的是一个个的驱动器盘符&#xff1a;每个驱动器都有自己的根目录结构&#xff0c;这样形成了多个树并列的情形。在 Linux 下&#xff0c;我们是看不到这…

jar打包 jar line too long 异常处理方法

http://hi.baidu.com/hoszone/item/e5165353062e2e828d12eddb 在jar的manifest.mf中加入了所依赖的所有jar路径&#xff0c;结果报错说 IOException("line too long") 然后查看这个地方java.util.jar.Attributes.read方法里&#xff0c;针对每行读入的数据有个byte限…

LeetCode MySQL 178. 分数排名(dense_rank连续排名)

文章目录1. 题目2. 解题1. 题目 编写一个 SQL 查询来实现分数排名。 如果两个分数相同&#xff0c;则两个分数排名&#xff08;Rank&#xff09;相同。 请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。 换句话说&#xff0c;名次之间不应该有“间隔”。 --…

编辑神器Vi介绍及常用命令

1 vi 简介vi 编辑器是 Linux 和 Unix 上最基本的文本编辑器&#xff0c;工作在字符模式下。由于不需要图形界面&#xff0c;vi 是效率很高的文本编辑器。尽管在 Linux 上也有很多图形界面的编辑器可用&#xff0c;但 vi 在系统和服务器管理中的功能是那些图形编辑器所无法比拟的…

LeetCode MySQL 185. 部门工资前三高的所有员工(dense_rank)

文章目录1. 题目2. 解题1. 题目 Employee 表包含所有员工信息&#xff0c;每个员工有其对应的工号 Id&#xff0c;姓名 Name&#xff0c;工资 Salary 和部门编号 DepartmentId 。 --------------------------------- | Id | Name | Salary | DepartmentId | ---------------…

jquery非常不错的图片切换,多种切换效果

下载&#xff1a; http://files.cnblogs.com/timy/wowslider.rar转载于:https://www.cnblogs.com/timy/archive/2013/04/03/2998381.html

linux 子目录 挂载,linux – NFS4 – 挂载多个子目录

我正在尝试在NFS4服务器上设置2个不同的挂载点,但无法使其按预期工作./etc/exports (on server)/mnt/raid/nas 10.1.0.0/18(rw,fsid0,sync)/mnt/raid/nas/file/perm 10.1.0.0/18(rw,sync,all_squash,no_subtree_check,anonuid501,anongid503)/mnt/raid/nas/mail 10.1.0.0/18(rw…

python历史以及基础知识

1. Python 基础知识1.1 Python 历史1.1.1 Python 起源Python 的作者&#xff0c;Guido von Rossum&#xff0c;荷兰人。1982 年&#xff0c;Guido 从阿姆斯特丹大学获得了数学和计算机硕士学位。然而&#xff0c;尽管他算得上是一位数学家&#xff0c;但他更加享受计算机带来的…

SQLSERVER字符串截取------STUFF

STUFF ( character_expression , start , length ,character_expression ) 参数 character_expression 一个字符数据表达式。character_expression 可以是常量、变量&#xff0c;也可以是字符列或二进制数据列。 start 一个整数值&#xff0c;指定删除和插入的开始位置。如…