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 相关文章推荐
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
Python魔术方法详解
Feb 14 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
python中p-value的实现方式
Dec 16 Python
python 类之间的参数传递方式
Dec 20 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
Python新手学习函数默认参数设置
Jun 03 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
python实现发送QQ邮件(可加附件)
Dec 23 Python
Python中X[:,0]和X[:,1]的用法
May 10 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
smtp邮件发送一例
2006/10/09 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
php无序树实现方法
2015/07/28 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
python解析xml模块封装代码
2014/02/07 Python
Python中的闭包实例详解
2014/08/29 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
班级活动策划书
2014/02/06 职场文书
硕士研究生就业推荐信
2014/05/18 职场文书
敬老月活动总结
2014/08/28 职场文书
法人授权委托书范本
2014/09/17 职场文书
党员查摆剖析材料
2014/10/10 职场文书
保留意见审计报告
2015/06/05 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
php访问对象中的成员的实例方法
2021/11/17 PHP
HttpClient实现文件上传功能
2022/08/14 Java/Android