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基础教程之lambda表达式使用方法
Feb 12 Python
Python的净值数据接口调用示例分享
Mar 15 Python
Django入门使用示例
Dec 12 Python
python中退出多层循环的方法
Nov 27 Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 Python
django项目简单调取百度翻译接口的方法
Aug 06 Python
Python Web框架之Django框架文件上传功能详解
Aug 16 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
python实现电子词典
Mar 03 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 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学习 变量使用总结
2011/03/24 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
高中毕业自我评价
2014/02/08 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
老公给老婆的保证书
2014/04/28 职场文书
实习公司领导推荐函
2014/05/21 职场文书
新书发布会策划方案
2014/06/09 职场文书
单位消防安全责任书
2014/07/23 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书