python UDF 实现对csv批量md5加密操作


Posted in Python onJanuary 01, 2021

工作上遇到需求,一批手机号要md5加密导出。为了保证数据安全,所以没有采用网上工具来加密。

md5的加密算法是开源的且成熟的,很多语言都有对应包可以直接用,我写了一个简单的python来实现,另一位同事做了一个hiveUDF来实现,这里都给大家分享一下。

目标:

读取csv文件,并且对其中的内容进行md5加密,32位加密,将加密后的密文存入另一个csv文件。

python实现:

(1)准备好要读取的csv文件。单列,一行存一个手机号码。

python UDF 实现对csv批量md5加密操作

(2)python代码:

#encoding=utf8
import hashlib #加密模块
import os

#定义一个加密函数,32位md5加密
def md5_encryption(str):
 m=hashlib.md5()
 m.update(str)
 return m.hexdigest()

#准备要读取的csv和要被写入的csv,两个文件要和此python放在同一个文件夹里
readfilename=os.path.join(os.path.dirname(__file__),"testcsv.csv")
writefilename=os.path.join(os.path.dirname(__file__),"writecsv.csv")
print('read:',readfilename)
print('write:',writefilename)

with open(readfilename,'r') as rf:
 #逐行写入加密后的密文,strip函数用于剔除换行符\n,不然是对“13000000\n”加密而不是对“13000000”加密
 with open(writefilename,'w') as wf: 
 for row in rf.readlines():
  wf.write(md5_encryption(row.strip())) 
  wf.write('\n')
 #计算一下写入的行数
 with open(writefilename,'r') as rwf:
 count=0
 while 1:
  buffer=rwf.read(1024*8192)
  if not buffer:
  break
  count+=buffer.count('\n')
 print('line writed number:',count)

(3)结果

python UDF 实现对csv批量md5加密操作

python UDF 实现对csv批量md5加密操作

hive UDF 实现:

(1)用java写一个类用来实现加密,用maven打成jar包

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.commons.lang.StringUtils;
import java.security.MessageDigest;
public class MD5 extends UDF {
 public String evaluate (final String str) {
 if (StringUtils.isBlank(str)){
  return "";
 }
 String digest = null;
 StringBuffer buffer = new StringBuffer();
 try {
  MessageDigest digester = MessageDigest.getInstance("md5");
  byte[] digestArray = digester.digest(str.getBytes("UTF-8"));
  for (int i = 0; i < digestArray.length; i++) {
  buffer.append(String.format("%02x", digestArray[i]));
  }
  digest = buffer.toString();
 } catch (Exception e) {
  e.printStackTrace();
 }
 return digest;
 }
 public static void main (String[] args ) {
 MD5 md5 = new MD5();
 System.out.println(md5.evaluate(" "));
 }
}

(2)配置一下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>HiveUdf</groupId>
 <artifactId>HiveUdf</artifactId>
 <version>1.0-SNAPSHOT</version>

 <dependencies>
 <dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>0.14.0</version>
 </dependency>
 <dependency>
  <groupId>org.apache.calcite</groupId>
  <artifactId>calcite-core</artifactId>
  <version>0.9.2-incubating</version>
 </dependency>
 <dependency>
  <groupId>org.apache.calcite</groupId>
  <artifactId>calcite-avatica</artifactId>
  <version>0.9.2-incubating</version>
 </dependency>
 <dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.6.0</version>
 </dependency>
 </dependencies>
</project>

(3)hive中配置udf

导入jar包:

hive> add jar hdfs:/user/udf/HiveUdf-1.0-SNAPSHOT.jar;

新建一个函数:

hive> create temporary function MD5 as 'MD5';

使用:

hive> select MD5('12345');
OK
827ccb0eea8a706c4c34a16891f84e7b
Time taken: 0.139 seconds, Fetched: 1 row(s)
hive> 
hive> select phone,MD5(phone) from mid_latong_20200414 limit 5;
OK
1300****436 856299f44928e90****181b0cc1758c4
1300****436 856299f44928e90****181b0cc1758c4
1300****689 771dfa9ef00f43c****4901a3f1d1fa0
1300****689 771dfa9ef00f43c****4901a3f1d1fa0
1300****689 771dfa9ef00f43c****4901a3f1d1fa0
Time taken: 0.099 seconds, Fetched: 5 row(s)

以上就是python和hiveUDF两种实现md5加密的方法啦!

补充:python的MD5加密的一点坑

曾经在做某ctf题目时,被这点坑,坑了好久。

废话不多说,进入正题。

python MD5加密方法

import hashlib   //导入hash库函数
text = "bolg.csdn.net"   //要加密的文本
md5_object = hashlib.md5()   //创建一个MD5对象
md5_object.update(text)   //添加去要加密的文本
print md5_object.hexdigest()  //输出加密后的MD5值

坑在哪?

当你在进行第一次加密时,程序正常输出MD5值,但是在同一程序中进行第二次明文加密时,如果你的代码是这样写,就不会得到正确的MD5值。

python UDF 实现对csv批量md5加密操作

python UDF 实现对csv批量md5加密操作

通过对第一张图片和第二张图片的比较,发现如果按照第一张图片的代码进行连续加密时,它实质上是在加密每次明文的叠加。

即第一次加密:csdn

第二次加密:csdnblog

正确做法应该是:

python UDF 实现对csv批量md5加密操作

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
Python中使用摄像头实现简单的延时摄影技术
Mar 27 Python
Python实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
Python模拟登陆实现代码
Jun 14 Python
用Python实现KNN分类算法
Dec 22 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
python自动化之Ansible的安装教程
Jun 13 Python
关于pytorch处理类别不平衡的问题
Dec 31 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
Python自动化操作实现图例绘制
Jul 09 Python
看看如何用Python绘制小米新版天价logo
Apr 20 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 #Python
python matlab库简单用法讲解
Dec 31 #Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 #Python
python爬虫基础之urllib的使用
Dec 31 #Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 #Python
Python实现Appium端口检测与释放的实现
Dec 31 #Python
python 基于selectors库实现文件上传与下载
Dec 31 #Python
You might like
ThinkPHP分页实例
2014/10/15 PHP
php实现的RSS生成类实例
2015/04/23 PHP
Symfony控制层深入详解
2016/03/17 PHP
Js的MessageBox
2006/12/03 Javascript
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
Python 类的特殊成员解析
2018/06/20 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
python如何更新包
2020/06/11 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
大学生专科学习生活的自我评价
2013/12/07 职场文书
同学会邀请书大全
2014/01/12 职场文书
高三学习决心书
2014/03/11 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
企业催款函范本
2015/06/24 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers