最近在工作中需要对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加密相关推荐

  1. 大数据hive篇--UDF函数

    什么是UDF: 它是User defined Function的简写,意思是用户自定义方法 为什么要用UDF? hive自带了一些函数,比如:max.min 等,但是自带的函数数量有限,所以hive提 ...

  2. hive 的udf 函数使用

    1)依据课程讲解UDF编程案例,完成练习,总结开发UDF步骤,代码贴图,给予注释,重点 2)更改emp 表中名字的大写给为小写. 一:hive 的udf 函数: 1.1 hive UDF 函数概述: ...

  3. 如何写hive的udf函数?

    最近感受了hive的udf函数的强大威力了,不仅可以使用很多已经有的udf函数,还可以自己定义符合业务场景的udf函数,下面就说一下如何写udf/udaf/udtf函数,算是一个入门介绍吧. Firs ...

  4. hive的UDF函数的使用。常见UDF函数

    UDF的话一般是hive提供的函数功能满足不了业务需要,我们就会自己来写UDF函数来辅助完成,对于我们常用的函数而言还是哪些常见的聚合函数,如:count.sum.avg.max.min等,其他的话就 ...

  5. Hive 自定义UDF函数讲解

    目录 一.UDF描述 二.UDF种类 三.自定义实现UDF和UDTF 3.1 需求 3.2 项目pom文件 3.3 Hive建表测试及数据 3.4UDF函数编写 3.5 UDTF函数编写 四:添加到h ...

  6. HIVE自定义UDF函数-经纬度转换成省市地址

    目录 1.需求背景 2.解决方案 3.代码pom引用 4.代码集成UDF 5.编译jar包 6.使用说明 7.将jar包放到hdfs 8.创建持久化function 9.测试 10.结语 1.需求背景 ...

  7. hive最新UDF函数(2016-10-25)

    为什么80%的码农都做不了架构师?>>>    hive UDF函数 :(后期翻译,暂时先贴着,有兴趣来  http://apache.wiki 可以一起来翻译呀) https:// ...

  8. flink sql udf jar包_编写Hive的UDF(查询平台数据同时向mysql添加数据)

    可能会有一些截图中会有错误提示,是因为本地的包一直包下载有问题,截完图已经下载好了. 创建包结构 创建一个基础信息类 所有输出到mysql数据库中的自定义MR任务的自定义key均需要实现该抽象类 代码 ...

  9. hive添加udf函数

    1,临时函数 重启hive后函数失效 1)首先在hive中添加jar包 出现added就是成功了 hive (default)> add jar /opt/hiveudf2.jar ; Adde ...

最新文章

  1. 跟着百度学PHP[14]-PDO-优化驱动
  2. 网站开发常用jQuery插件总结(四)验证插件validation
  3. 小程序 background-image背景图片设置的注意点
  4. 【Github】怎么在README.md中添加图片?
  5. 尝试改写新浪网分类资讯爬虫2
  6. Android Bitmaps缓存
  7. Windows DWrite 组件 RCE 漏洞 (CVE-2021-24093) 分析
  8. Zephyr下使用TFLite进行语音识别
  9. c++语言函数参数传递方式,C++函数传递三种方式解读
  10. CSRF与XSS攻击的原理与防范
  11. C语言与线性代数,编程与线性代数
  12. Omapl138 AT070TN83 lcd驱动移植
  13. Google Earth Engine(GEE)——美国近地表高精度实时气象数据集(2500米分辨率)
  14. IT科技业2012事件与人物:移动互联网时代
  15. Unity导入Mixamo动画,合并Mixamo动作
  16. Flutter中AspectRatio、Card 卡片组件
  17. 最常见的8种网络安全攻击类型!
  18. 最近的题目总结(树,电话线铺设,我的天)
  19. jQuery根据ID、CLASS、等获取对象
  20. BAPI_ACC_DOCUMENT_CHECK BAPI_ACC_DOCUMENT_POST BAPI_TRANSACTION_COMMIT

热门文章

  1. python3获取图片拍摄位置和时间
  2. 动态给img图片设置宽/高
  3. shell中各种括号()、(())、[]、[[]]、{}的作用和区别
  4. Linux下查看系统启动时间、安装时间
  5. linux 给目录添加权限
  6. android电话拨号器的使用
  7. springboot+vue+Elementui共享单车管理系统
  8. 疯壳AI开源无人机开机测试及硬件资源介绍
  9. 区块链学习笔记:硬分叉和软分叉
  10. 石英砂过滤器 多介质过滤器 活性炭过滤器