Hive 使用UDF函数对数据SM3加密
最近在工作中需要对hive中某些数据进行SM3加密,在网上找了很久,遇到一些坑,在这里分享。
例:取姓名第一个汉字后接身份证号进行SM3加密。
1.SM3工具类
pom.xml:
<!--sm3,sm4加密算法--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.64</version></dependency>
Sm3Utils:
package UtilsTool;import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*** sm3加密算法工具类* 加密与加密结果验证(不可逆算法)* @version 1.0*/
public class Sm3Utils {private static final String ENCODING = "UTF-8";static {Security.addProvider(new BouncyCastleProvider());}/*** sm3算法加密* @explain* @param paramStr* 待加密字符串* @return 返回加密后,固定长度=32的16进制字符串*/public static String encrypt(String paramStr) {// 将返回的hash值转换成16进制字符串String resultHexString = null;// 将字符串转换成byte数组byte[] srcData = new byte[0];try {srcData = paramStr.getBytes(ENCODING);} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 调用hash()byte[] resultHash = hash(srcData);// 将返回的hash值转换成16进制字符串resultHexString = ByteUtils.toHexString(resultHash);//resultHexString = ToHexString.bytesToHexString(resultHash);return resultHexString;}/*** 返回长度=32的byte数组* @explain 生成对应的hash值* @param srcData* @return*/public static byte[] hash(byte[] srcData) {SM3Digest digest = new SM3Digest();digest.update(srcData, 0, srcData.length);byte[] hash = new byte[digest.getDigestSize()];digest.doFinal(hash, 0);return hash;}/*** 通过密钥进行加密* @explain 指定密钥进行加密* @param key* 密钥* @param srcData* 被加密的byte数组* @return*/public static byte[] hmac(byte[] key, byte[] srcData) {KeyParameter keyParameter = new KeyParameter(key);SM3Digest digest = new SM3Digest();HMac mac = new HMac(digest);mac.init(keyParameter);mac.update(srcData, 0, srcData.length);byte[] result = new byte[mac.getMacSize()];mac.doFinal(result, 0);return result;}/*** 判断源数据与加密数据是否一致* @explain 通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据* @param srcStr* 原字符串* @param sm3HexString* 16进制字符串* @return 校验结果*/public static boolean verify(String srcStr, String sm3HexString) {boolean flag = false;try {byte[] srcData = srcStr.getBytes(ENCODING);byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString);byte[] newHash = hash(srcData);if (Arrays.equals(newHash, sm3Hash))flag = true;} catch (UnsupportedEncodingException e) {e.printStackTrace();}return flag;}
}
代码里有校验方法,可以自己校验。
工具类来源及校验方法:java sm3国密算法加密、验证工具类_not_say的博客-CSDN博客_java sm3
2.UDF函数
package DesensitizationTool;import UtilsTool.Sm3Utils;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Replace extends UDF {public static String evaluate(String name, String id) throws UnsupportedEncodingException {return CardReplace(name,id);
}
public static String CardRepalce(String name, String id) {try {name = new String(name.getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}Pattern p = Pattern.compile("[\u4e00-\u9fa5\uF900-\uFA2D]");Pattern e = Pattern.compile("[a-zA-z]");Matcher m1 = p.matcher(name);Matcher m2 = e.matcher(name);Matcher c = p.matcher(id);String id2 = null;String sm3 = null;String id3 = null;if (m1.find()){//截取第一个汉字 后接证件号码id2 = name.substring(0,1) + id;//取上述字符串的sm3杂凑值sm3 = Sm3Utils.encrypt(id2).toLowerCase();}if (m2.find()){//截取英文前三个字节(大写),后接证件号id2 = name.toUpperCase().substring(0,3) + id;//取上述字符串的sm3杂凑值sm3 = Sm3Utils.encrypt(id2).toLowerCase();}//取身份证件号码UTF-8编码的前6个字节,后接上述SM3杂凑值if (c.find()){id3 = id.substring(0,2) + sm3;}if (!c.find()){id3 = id.substring(0,6) + sm3;}return id3;}
}
3.项目打包上传并执行
具体操作不赘述,网上啥都有。。。
Hive_UDF开发指南_迎难而上-CSDN博客_hive udf
4.报错:Unhandled exception:java.io.UnsupportedEncodingException
这里有坑,我在网上找了很多很多解决方法都没用。而且我在idea上测试是正常的,打包到Linux就报错。一遍遍看代码,Sm3Utils里有个玩意引起了我的注意:
static {Security.addProvider(new BouncyCastleProvider());}
BouncyCastle是干啥的呢?
具体解释及使用:BouncyCastle使用_mrly-CSDN博客_bouncycastle
我查了自己Linux环境上并没有该加密方式,那么就很简单了。
1、下载对应版本的jar包:https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on/1.64
2、放入$JAVA_HOME\jre\lib\ext目录下。
3、修改配置文件$JAVA_HOME\jre\lib\security\java.security
加入一行配置:security.provider.按顺序填数字=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
#前面为Java环境提供的
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
5.运行
OK,齐活。
Hive 使用UDF函数对数据SM3加密相关推荐
- 大数据hive篇--UDF函数
什么是UDF: 它是User defined Function的简写,意思是用户自定义方法 为什么要用UDF? hive自带了一些函数,比如:max.min 等,但是自带的函数数量有限,所以hive提 ...
- hive 的udf 函数使用
1)依据课程讲解UDF编程案例,完成练习,总结开发UDF步骤,代码贴图,给予注释,重点 2)更改emp 表中名字的大写给为小写. 一:hive 的udf 函数: 1.1 hive UDF 函数概述: ...
- 如何写hive的udf函数?
最近感受了hive的udf函数的强大威力了,不仅可以使用很多已经有的udf函数,还可以自己定义符合业务场景的udf函数,下面就说一下如何写udf/udaf/udtf函数,算是一个入门介绍吧. Firs ...
- hive的UDF函数的使用。常见UDF函数
UDF的话一般是hive提供的函数功能满足不了业务需要,我们就会自己来写UDF函数来辅助完成,对于我们常用的函数而言还是哪些常见的聚合函数,如:count.sum.avg.max.min等,其他的话就 ...
- Hive 自定义UDF函数讲解
目录 一.UDF描述 二.UDF种类 三.自定义实现UDF和UDTF 3.1 需求 3.2 项目pom文件 3.3 Hive建表测试及数据 3.4UDF函数编写 3.5 UDTF函数编写 四:添加到h ...
- HIVE自定义UDF函数-经纬度转换成省市地址
目录 1.需求背景 2.解决方案 3.代码pom引用 4.代码集成UDF 5.编译jar包 6.使用说明 7.将jar包放到hdfs 8.创建持久化function 9.测试 10.结语 1.需求背景 ...
- hive最新UDF函数(2016-10-25)
为什么80%的码农都做不了架构师?>>> hive UDF函数 :(后期翻译,暂时先贴着,有兴趣来 http://apache.wiki 可以一起来翻译呀) https:// ...
- flink sql udf jar包_编写Hive的UDF(查询平台数据同时向mysql添加数据)
可能会有一些截图中会有错误提示,是因为本地的包一直包下载有问题,截完图已经下载好了. 创建包结构 创建一个基础信息类 所有输出到mysql数据库中的自定义MR任务的自定义key均需要实现该抽象类 代码 ...
- hive添加udf函数
1,临时函数 重启hive后函数失效 1)首先在hive中添加jar包 出现added就是成功了 hive (default)> add jar /opt/hiveudf2.jar ; Adde ...
最新文章
- 跟着百度学PHP[14]-PDO-优化驱动
- 网站开发常用jQuery插件总结(四)验证插件validation
- 小程序 background-image背景图片设置的注意点
- 【Github】怎么在README.md中添加图片?
- 尝试改写新浪网分类资讯爬虫2
- Android Bitmaps缓存
- Windows DWrite 组件 RCE 漏洞 (CVE-2021-24093) 分析
- Zephyr下使用TFLite进行语音识别
- c++语言函数参数传递方式,C++函数传递三种方式解读
- CSRF与XSS攻击的原理与防范
- C语言与线性代数,编程与线性代数
- Omapl138 AT070TN83 lcd驱动移植
- Google Earth Engine(GEE)——美国近地表高精度实时气象数据集(2500米分辨率)
- IT科技业2012事件与人物:移动互联网时代
- Unity导入Mixamo动画,合并Mixamo动作
- Flutter中AspectRatio、Card 卡片组件
- 最常见的8种网络安全攻击类型!
- 最近的题目总结(树,电话线铺设,我的天)
- jQuery根据ID、CLASS、等获取对象
- BAPI_ACC_DOCUMENT_CHECK BAPI_ACC_DOCUMENT_POST BAPI_TRANSACTION_COMMIT
热门文章
- python3获取图片拍摄位置和时间
- 动态给img图片设置宽/高
- shell中各种括号()、(())、[]、[[]]、{}的作用和区别
- Linux下查看系统启动时间、安装时间
- linux 给目录添加权限
- android电话拨号器的使用
- springboot+vue+Elementui共享单车管理系统
- 疯壳AI开源无人机开机测试及硬件资源介绍
- 区块链学习笔记:硬分叉和软分叉
- 石英砂过滤器 多介质过滤器 活性炭过滤器