用hive的udf自定义函数实现对数据仓库的表数据进行RSA加密以及解密

##udf加密

package test_rsa;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;

public class test {
    public String evaluate(String str)throws  Exception{
     String s=""; //公钥字符串
     BASE64Decoder base64Decoder = new BASE64Decoder();
        byte[] keybyte = base64Decoder.decodeBuffer(s);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keybyte);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
        System.out.println(rsaPublicKey);
        BigInteger e = rsaPublicKey.getPublicExponent();
        BigInteger n = rsaPublicKey.getModulus();
        byte[] text = str.getBytes("utf-8");
        BigInteger m = new BigInteger(text);
        BigInteger c = m.modPow(e, n);
        byte[] bytes = c.toByteArray();
        BASE64Encoder base64Encoder = new BASE64Encoder();
        String encode = base64Encoder.encode(bytes).replace("\n","").replace("\r","");
        return  encode;
    }

##udf解密

package test_rsa;
import org.apache.hadoop.hive.ql.exec.UDF;
import sun.misc.BASE64Decoder;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;

public class Jiema extends UDF {
    public String evaluate(String str) throws  Exception {
        String s = ""; //私钥字符串 (私钥格式必须是PKCS8的,PKCS1的格式会报错)
        BASE64Decoder base64Decoder = new BASE64Decoder();
        byte[] bytes = base64Decoder.decodeBuffer(s);
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(bytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        BigInteger d = rsaPrivateKey.getPrivateExponent();
        BigInteger n = rsaPrivateKey.getModulus();

        byte[] bytes1 = base64Decoder.decodeBuffer(str); //str位加密后的密文
        byte[] decode = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode(str);
        BigInteger c = new BigInteger(decode);
        BigInteger bigInteger = c.modPow(d, n);
        byte[] bytes2 = bigInteger.toByteArray();
        String text="";
        for (int i = 0; i < bytes2.length; i++) {
            text += String.valueOf((char)bytes2[i]);
        }
        return text;
    }
}

你可能感兴趣的:(用hive的udf自定义函数实现对数据仓库的表数据进行RSA加密以及解密)