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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
Jul 09 Python
Python类的多重继承问题深入分析
Nov 09 Python
Python MD5加密实例详解
Aug 02 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
Python 70行代码实现简单算式计算器解析
Aug 30 Python
详解Python3 pandas.merge用法
Sep 05 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
python time.strptime格式化实例详解
Feb 03 Python
python实现简单的聊天小程序
Jul 07 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
JS 判断undefined的实现代码
2009/11/26 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
Python 爬虫图片简单实现
2017/06/01 Python
python基础教程项目二之画幅好画
2018/04/02 Python
python反编译学习之字节码详解
2019/05/19 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
个人简历的自荐信
2013/10/23 职场文书
个人简历中自我评价
2014/02/11 职场文书
《中华少年》教学反思
2014/02/15 职场文书
迎新晚会策划方案
2014/06/13 职场文书