服务器之家

服务器之家 > 正文

python UDF 实现对csv批量md5加密操作

时间:2021-08-20 00:36     来源/作者:lee_moonj

工作上遇到需求,一批手机号要md5加密导出。为了保证数据安全,所以没有采用网上工具来加密。

md5的加密算法是开源的且成熟的,很多语言都有对应包可以直接用,我写了一个简单的python来实现,另一位同事做了一个hiveudf来实现,这里都给大家分享一下。

目标:

读取csv文件,并且对其中的内容进行md5加密,32位加密,将加密后的密文存入另一个csv文件。

python实现:

(1)准备好要读取的csv文件。单列,一行存一个手机号码。

python UDF 实现对csv批量md5加密操作

(2)python代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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包:

?
1
hive> add jar hdfs:/user/udf/hiveudf-1.0-snapshot.jar;

新建一个函数:

?
1
hive> create temporary function md5 as 'md5';

使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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加密方法

?
1
2
3
4
5
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加密操作

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/IKnowNothinglee/article/details/105576506

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部