日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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并不兼容??蛻魰簳r只能考慮使用程序加密的方式實現。

對于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更新

總結

以上是生活随笔為你收集整理的oracle加密可以跟java一致吗,在GBase 8s上使用java udr实现Oracle兼容的加密解密功能...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。