创建hive的AES加密解密函数
1.写java代码,打jar包
1.pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zmlearn.udf</groupId><artifactId>udf</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><!-- hive的udf依赖的包 --><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>2.1.0</version></dependency></dependencies><!-- 打包类的依赖的jar的插件 --><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>
2. AES对称加密和解密类
package com.zmlearn.udf;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Scanner;/** AES对称加密和解密*/
public class AES {public static final String ENCODE_RULES = "8DFC34B0B7C98EFA0A299A6C3FFFBD9D";/** 加密* 1.构造密钥生成器* 2.根据ecnodeRules规则初始化密钥生成器* 3.产生密钥* 4.创建和初始化密码器* 5.内容加密* 6.返回字符串*/public static String AESEncode(String encodeRules,String content){try {//1.构造密钥生成器,指定为AES算法,不区分大小写KeyGenerator keygen=KeyGenerator.getInstance("AES");//2.根据ecnodeRules规则初始化密钥生成器//生成一个128位的随机源,根据传入的字节数组SecureRandom random = SecureRandom.getInstance("SHA1PRNG");random.setSeed(encodeRules.getBytes());keygen.init(128, random); //3.产生原始对称密钥SecretKey original_key=keygen.generateKey();//4.获得原始对称密钥的字节数组byte [] raw=original_key.getEncoded();//5.根据字节数组生成AES密钥SecretKey key=new SecretKeySpec(raw, "AES");//6.根据指定算法AES自成密码器Cipher cipher=Cipher.getInstance("AES");//7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEYcipher.init(Cipher.ENCRYPT_MODE, key);//8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码byte [] byte_encode=content.getBytes(StandardCharsets.UTF_8);//9.根据密码器的初始化方式--加密:将数据加密byte [] byte_AES=cipher.doFinal(byte_encode);//10.将加密后的数据转换为字符串//这里用Base64Encoder中会找不到包//解决办法://在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。//11.将字符串返回return new BASE64Encoder().encode(byte_AES);} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {e.printStackTrace();}//如果有错就返加nulllreturn null;}/** 解密* 解密过程:* 1.同加密1-4步* 2.将加密后的字符串反纺成byte[]数组* 3.将加密内容解密*/public static String AESDncode(String encodeRules,String content){try {//1.构造密钥生成器,指定为AES算法,不区分大小写KeyGenerator keygen=KeyGenerator.getInstance("AES");//2.根据ecnodeRules规则初始化密钥生成器//生成一个128位的随机源,根据传入的字节数组SecureRandom random = SecureRandom.getInstance("SHA1PRNG");random.setSeed(encodeRules.getBytes());keygen.init(128, random);//3.产生原始对称密钥SecretKey original_key=keygen.generateKey();//4.获得原始对称密钥的字节数组byte [] raw=original_key.getEncoded();//5.根据字节数组生成AES密钥SecretKey key=new SecretKeySpec(raw, "AES");//6.根据指定算法AES自成密码器Cipher cipher=Cipher.getInstance("AES");//7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEYcipher.init(Cipher.DECRYPT_MODE, key);//8.将加密并编码后的内容解码成字节数组byte [] byte_content= new BASE64Decoder().decodeBuffer(content);/** 解密*/byte [] byte_decode=cipher.doFinal(byte_content);return new String(byte_decode, StandardCharsets.UTF_8);} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IOException | IllegalBlockSizeException | BadPaddingException e) {e.printStackTrace();}//如果有错就返加nulllreturn null;}public static void main(String[] args) {Scanner scanner=new Scanner(System.in);/** 加密*/System.out.println("使用AES对称加密,请输入加密的规则");String encodeRules=scanner.next();System.out.println("请输入要加密的内容:");String content = scanner.next();System.out.println("根据输入的规则"+encodeRules+"加密后的密文是:"+ AESEncode(encodeRules, content));/** 解密*/System.out.println("使用AES对称解密,请输入加密的规则:(须与加密相同)");encodeRules=scanner.next();System.out.println("请输入要解密的内容(密文):");content = scanner.next();System.out.println("根据输入的规则"+encodeRules+"解密后的明文是:"+ AESDncode(encodeRules, content));}}
3.UDF函数
package com.zmlearn.udf;
import org.apache.hadoop.hive.ql.exec.UDF;public class AESUDF extends UDF{String password = "8DFC34B0B7C98EFA0A299A6C3FFFBD9D";public String evaluate ( String type , String content) throws Exception {if (content == null) return null;if(! type.equals("encode") && ! type.equals("decode")){throw new Exception("Parmeter one is needed encode/decode");}if( type.equals("encode")){//进行加密return AES.AESEncode (password, content);}else {//进行解密return AES.AESDncode(password, content);}}public static void main(String[] args) {try {System.out.println(new AESUDF().evaluate("encode","test"));System.out.println(new AESUDF().evaluate("decode","bkP4HSbPbL+yqViBjfvQJg=="));} catch (Exception e) {e.printStackTrace();}}
}
2.将打好的jar上传到hdfs
1.打包步骤
点击idea的Maven后,点击package。如下图
2.将打包后的udf-1.0-SNAPSHOT.jar,上传到hdfs上面
#一定记得,不然创建函数的时候会报警Class com.zmlearn.udf.AESUDF not found,因为没有执行权限
chmod 777 /tmp/udf-1.0-SNAPSHOT.jarhadoop fs -mkdir /hive_UDFhadoop fs -put /root/data/udf-1.0-SNAPSHOT.jar /hive_UDF
3.进入hive客户端,创建UDF函数。
create function AES_UDF as 'com.zmlearn.udf.AESUDF' using jar
'hdfs://nameservice1/hive_UDF/udf-1.0-SNAPSHOT.jar';
4.使用创建的UDF函数:
1.加密
insert overwrite table test2 partition(dt='2020-06-01')
select AES_UDF('encode',dnum),AES_UDF('encode',sn) from test1
2.解密
insert overwrite table test1 partition(dt='2020-06-01')
select AES_UDF('decode',dnum),AES_UDF('decode',sn) from test2
创建hive的AES加密解密函数相关推荐
- ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密
**PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...
- C语言实现AES加密解密
AES加密是美国联邦政府采用的一种块加密标准,如今已经被全世界广为使用.嵌入式开发中我们也经常会用到加密解密算法,如果没有硬件模块来实现,就需要用到C代码软件实现.下面介绍调用mbedTLS中的AES ...
- AES加密解密python实现
1.前言 关于现代密码学算法,可以查看以下博客全面了解 CISSP考试要求里的"应用密码学"内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客 AES的细节知识,可以查阅 AES加密 ...
- c++实现AES加密解密算法
本文讲解c++实现AES加密解密功能,主要包含两部分: 实现AES加密解密功能的静态库 实现调用静态库的测试文件 本文代码是在win10系统,VS2013下调试. 一.AES加解密静态库 创建静态库工 ...
- android、ios、php之间AES加密解密
使用原因: 因为在项目中,需要在与客户端(IOS,Android)交互的时候,保存一些私有信息,不被别人看到,所以,使用了比较流行的可以反向加解密的AES. PHP 源码 <?php$aes = ...
- python 加密解密_python实现AES加密解密
本文实例为大家分享了python实现AES加密解密的具体代码,供大家参考,具体内容如下 (1)对于AES加密解密相关知识 (2)实现的功能就是输入0-16个字符,然后经过AES的加密解密最后可以得到原 ...
- openssl与cryptoAPI交互AES加密解密
原文: http://blog.csdn.net/zhouyuqwert/article/details/7422467 有读者指出代码贴两遍,修改下. 继上次只有CryptoAPI的加密后,这次要实 ...
- AES加密解密SHA1、SHA加密MD5加密
AES加密解密 SHA1.SHA加密 MD5加密 二话不说马上附上代码: package com.luo.util; import java.io.UnsupportedEncodingExcepti ...
- AES加密解密算法的C代码实现
AES 加密解密的原理我就不说了, 弟兄们自己上百度去查, 文章很多. 我这里只列出从网上获取的代码的实现, 我修改了一些, 可以很方便的使用到你的代码里面. AES 比DES算法的强度更强.A ...
最新文章
- 雍正继承帝位,给职场中的我们的启示 --- 我看电视剧《雍正王朝》
- 比特币耶稣Roger Ver:比特币现金是比特币扩容问题的答案
- js小效果-简易计算器
- oracle 账户 锁定 密码忘记了,Oracle System密码忘记 密码修改、删除账号锁定lock
- Mr.J--验证码登陆模块
- java判断回文用valueof_判断回文数,利用String类
- 阻塞和非阻塞(串口自环测试失败原因定位)
- Android Bitmap保存时背景变为黑色的问题
- 乐谱xml文件转为VOCALOID3的输入文件格式vsqx
- 海康摄像头监控预览二开,萤石云对接说明
- 上海财经应用统计考python_20上财应用统计415分经验帖(初试第一)
- Excel·VBA合并工作簿
- python让solidworks自动建模_让机器学习自动帮我们建模,这4个Python库能让你大开眼界...
- app门户开发——recycleView的页面的点击跳转
- Java选择题考试系统
- 【原创】畅言实现单点登录的设计流程和技术细节(1/2)
- Spring 5 + Spring MVC 5 + MyBatis 3 的 Maven 项目集成
- Unity3D之AssetBundle资源加载封装
- Log - Log日志入参
- 会议管理系统怎么加录播服务器,Teams会议视频怎么录制?这三种方法你知道吗...