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常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
flask框架自定义url转换器操作详解
Jan 25 Python
python函数中将变量名转换成字符串实例
May 11 Python
python中数字是否为可变类型
Jul 08 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 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 数组教程 定义数组
2009/10/23 PHP
PHP 万年历实现代码
2012/10/18 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
PHP图片水印类的封装
2017/07/06 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
javascript JSON操作入门实例
2010/04/16 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
python中定义结构体的方法
2013/03/04 Python
python读取注册表中值的方法
2013/04/08 Python
python之yield表达式学习
2014/09/02 Python
python套接字流重定向实例汇总
2016/03/03 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
Python如何实现邮件功能
2020/05/27 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
医学生实习自我鉴定
2013/09/27 职场文书
学年自我鉴定范文
2013/10/01 职场文书
财务会计大学生自我评价
2014/04/09 职场文书