gpt4 book ai didi

java - Java中的Hive Udf(加解密)

转载 作者:可可西里 更新时间:2023-11-01 14:34:01 28 4
gpt4 key购买 nike

实际上,我已经用 Java 编写了一个用于加密和解密的 Hive UDF。但它有一些小错误。我找不到它,有人可以请纠正并建议我做一些更改..

问题:

 When i tried to execute this code using Hive it is showing some 'Null' columns for each
row.
Encrypted Ex: 1 fdfsvansjw=
NULL NULL
2 adf4vandjw=
NULL NULL

Actually it has to be displayed without NULL Values.When i tried to decrypt the above
data it is adding Newline Character '/n' in place of Null.
Decrypted Ex: 1 AAA
/n /n
2 BBB
/n /n

加密代码:

package Encrypt;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
import java.security.*;
import org.apache.commons.codec.binary.Base64;
import java.io.*;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import javax.swing.JOptionPane;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public final class En1 extends UDF {

public Text evaluate(final Text s) throws Exception {
if (s == null) {
return null;
}
byte[] sharedvector = {
0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
};

String EncText = "";
byte[] keyArray = new byte[24];
byte[] temporaryKey;
String key = "developersnotedotcom";
byte[] toEncryptArray = null;

//try
// {

toEncryptArray = s.toString().getBytes("UTF-8");
MessageDigest m = MessageDigest.getInstance("MD5");
temporaryKey = m.digest(key.getBytes("UTF-8"));

if(temporaryKey.length < 24) // DESede require 24 byte length key
{
int index = 0;
for(int i=temporaryKey.length;i< 24;i++)
{
keyArray[i] = temporaryKey[index];
}
}

Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyArray, "DESede"), new IvParameterSpec(sharedvector));
byte[] encrypted = c.doFinal(toEncryptArray);
EncText = Base64.encodeBase64String(encrypted);


// }
/* catch(NoSuchAlgorithmException | UnsupportedEncodingException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException NoEx)
{
//JOptionPane.showMessageDialog(null, NoEx);
System.out.println(NoEx);
System.exit(1);
}*/

return new Text(EncText.toString());
}

}

输入:

Actual I/p Ex:    1      AAA
2 BBB

Encrypted O/p Ex: 1 fdfsvansjw=
NULL NULL
2 adf4vandjw=
NULL NULL

解密代码:

package Encrypt;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
import org.apache.commons.codec.binary.Base64;
import org.apache.hadoop.hive.ql.exec.FunctionTask;
import java.security.MessageDigest;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public final class Dec1 extends UDF {

public Text evaluate(final Text s) {
if (s == null) {
return null;
}
byte[] sharedvector = {
0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
};

String RawText = "";
byte[] keyArray = new byte[24];
byte[] temporaryKey;
String key = "developersnotedotcom";
byte[] toEncryptArray = null;

try
{

MessageDigest m = MessageDigest.getInstance("MD5");
temporaryKey = m.digest(key.getBytes("UTF-8"));

if(temporaryKey.length < 24) // DESede require 24 byte length key
{
int index = 0;
for(int i=temporaryKey.length;i< 24;i++)
{
keyArray[i] = temporaryKey[index];
}
}

Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyArray, "DESede"), new IvParameterSpec(sharedvector));
byte[] decrypted = c.doFinal(Base64.decodeBase64(s.toString()));
RawText = new String(decrypted, "UTF-8");
}
catch(Exception NoEx)
{
//JOptionPane.showMessageDialog(null, NoEx);
System.out.println(NoEx + "This is Udf error");
System.exit(1);
}

return new Text(RawText.toString());
}

}

输入:

Decrypted I/p Ex:     1      fdfsvansjw=
NULL NULL
2 adf4vandjw=
NULL NULL

Decrypted o/p Ex: 1 AAA
/n /n
2 BBB
/n /n

There should'nt be any Null's or /n when encryption and decryption.
Tried to find out the bug. But can't find out.
Please Help me.

Thanks

最佳答案

原因与Hive无关。

加密字符串由 CRLF 分隔,因此您应该删除加密方法末尾的 \r\n:return new Text(EncText.toString().replaceAll( "\r|\n", ""));

关于java - Java中的Hive Udf(加解密),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24226554/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com