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登录QQ邮箱发信的实现代码
Feb 10 Python
Python3控制路由器——使用requests重启极路由.py
May 11 Python
Python3.6正式版新特性预览
Dec 15 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
python实现自动化上线脚本的示例
Jul 01 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 Python
Django表单提交后实现获取相同name的不同value值
May 14 Python
python退出循环的方法
Jun 18 Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 Python
详解Python requests模块
Jun 21 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
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
php计算整个目录大小的方法
2015/06/19 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
php常用的工具开发整理
2019/09/26 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
为原生js Array增加each方法
2012/04/07 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
js中document.write的那点事
2014/12/12 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
使用Python的PIL模块来进行图片对比
2016/02/18 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
Python列表解析配合if else的方法
2018/06/23 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
Python for循环与range函数的使用详解
2019/03/23 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
PyQt5组件读取参数的实例
2019/06/25 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
怎样写好自我鉴定
2013/12/04 职场文书
面试后感谢信
2014/02/01 职场文书
销售冠军获奖感言
2014/02/03 职场文书
彩色的非洲教学反思
2014/02/18 职场文书
图书馆义工感想
2015/08/07 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers