HIVE UDF 加密加密函数

news/2024/9/24 11:28:06/文章来源:https://www.cnblogs.com/lxzcloud/p/18330021

一、AES算法

AES(Advanced Encryption Standard)即高级加密标准,是一种对称加密算法,被广泛应用于数据加密和保护领域。AES算法使用的密钥长度为128位、192位或256位,比DES算法的密钥长度更长,安全性更高

二、自定义UDF加解密函数

利用AES算法自定义UDF函数,实现在Hive中数据的加密解密功能

三、代码实现

1)MAVEN项目架构

 

2)POM依赖

<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.3</version>
</dependency>

3)创建utils工具类

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;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)操作,第二个参数为使用的KEY
            cipher.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 (BadPaddingException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (InvalidKeyException 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)操作,第二个参数为使用的KEY
            cipher.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 (Exception e) {e.printStackTrace();}//如果有错就返加nulllreturn null;}}

4)创建UDF

import com.utils.AES;
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) throws Exception {
//        AESUDF ase = new AESUDF();
//        System.out.println(ase.evaluate("encode", "hello world"));
//        System.out.println(ase.evaluate("decode","uW6YH6mvckQxBATpfJbMnw=="));
//    }
}

5)打包并上传到服务器进行测试

 5.1)启动hadoop、hive并把jar上传到 /opt/module/hive-3.1.2/jar_files/my_udf.jar;

 5.2)在hive中进行临时函数注册 add jar /opt/module/hive-3.1.2/jar_files/my_udf.jar;

 5.3)创建临时函数名称并绑定java class; create temporary function my_encode_udf as "com.lxz.AESUDF";

 5.4)进行测试

 

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

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

相关文章

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-06 PWM呼吸灯实验

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述小…

学成在线项目随笔

全局样式设定css阴影效果:使用flex布局时float:right不生效时flex布局等分方框,通过flex-grow实现,设置后通过text-align设置子元素位置

thinkphp: 安装fastadmin

一,官方地址: 1,官方站: https://www.fastadmin.net/ 2,文档地址: https://doc.fastadmin.net/docs/install.html二,安装: 1,下载: 下载地址: https://www.fastadmin.net/download.html 如图2, 解压fastadmin安装包到服务器,并解压: liuhongdi@lhdpc:/data/site/admin/fast$ …

windows编译ZLMediaKit流媒体服务webrtc

环境说明 ZLMediaKit编译需要的软件 visual studio 2022 cmake 3.29.0-rc2 OpenSSL 1.1.1w(不想踩坑的话安装这个版本) libsrtp 2.6.0 ZLMediaKit编译后运行需要 libsrtp 编译后且配置环境变量 ZLMediaKit 编译后文件cmake visual stuido 20222,自带cmake cmake可以到这两个地…

idea 删除项目

今天学习javadoc时在cmd命令提示符中总显示说“不是内部或外部命令,也不是可运行的程序或批处理文件”,因此上网查找解决办法,正所谓一顿操作猛如虎一看结果二百五。那些方法不仅没能解决问题,反而使原本好好的java class成为咖啡杯图标从而不能运行。 多次修改无果后,决定…

解决rust-analyzer加载时间过长等问题

若出现下述类似的问题,可以尝试使用本文的方法进行解决。vscode 一直卡在 fetching metadata 阶段出现报错 Blocking waiting for file lock on package cache出现报错 proc macro command not expanded: No proc-macros present for crate rust-analyzer(unresolved-proc-mac…

leetcode-8,真恶心

题目: 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。 推导:代码:1 class Automaton {2 public:3 int sign = 1; // 初始化默认符号4 long long ans = 0; // 初始化整数5 unordered_map<string, vector<string>&g…

论文阅读:Sequence to sequence learning for joint extraction of entities and relations

用以解决重叠关系问题 GGNNs模型 GGNNs(门控图神经网络,Gated Graph Neural Networks)是一种处理图结构数据的神经网络模型。它是图神经网络(GNN)的一个变体,使用了类似于长短时记忆网络(LSTM)中的门控机制来更有效地处理图中的信息流。 GGNNs的核心机制 GGNNs的核心思…

关于网站安全狗卸载了仍然能拦截的问题解决

关于网站安全狗卸载了仍然能拦截的问题解决如果你将所有safedog的文件删除的话,可能会导致Apache服务启动不了例如:这里没有提示相关安全狗的信息是因为我已经删除了Apache访问safedog的配置代码,只是提醒错误信息会如上图所示。 导致这种原因的结果大概率是因为Apache的con…

搭建自动化 Web 页面性能检测系统 —— 部署篇

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:琉易 liuxianyu.cn这一篇是系列文章: 搭建自动化 Web 页面性能检测系统 —— 设计篇 搭建自动化 Web 页面性能检测系统 —— 实现…

如何根据Linux Kernel Mailing List打patch

Linux内核正在不断开发和改进。每天的补丁都会提交到Linux内核邮件列表(LKML)。其中一些补丁被接受并合并到主流Linux内核中,供用户使用,而其他补丁则永远无法使用。 有时从LKML获取补丁是有用的,例如,如果你在内核中开发,或者只是因为你想保持在前沿。另一个原因可能是…

基于Drone实现CI/CD【0到1架构系列】

CI/CD是持续性集交和持续性部署,简单来讲就是自动化构建和自动化部署。目前有很多集成方案,也有很多组装方案,只要能实现自动化构建出制品,再自动部署到生产环境就行。 目前很多源代码都集成了CI/CD功能,drone也是目前比较流行的一个方案,简单易用,高性能。 前提条件 已…