工作上遇到需求,一批手机号要md5加密导出。为了保证数据安全,所以没有采用网上工具来加密。
md5的加密算法是开源的且成熟的,很多语言都有对应包可以直接用,我写了一个简单的python来实现,另一位同事做了一个hiveudf来实现,这里都给大家分享一下。
目标:
读取csv文件,并且对其中的内容进行md5加密,32位加密,将加密后的密文存入另一个csv文件。
python实现:
(1)准备好要读取的csv文件。单列,一行存一个手机号码。
(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)结果
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值。
通过对第一张图片和第二张图片的比较,发现如果按照第一张图片的代码进行连续加密时,它实质上是在加密每次明文的叠加。
即第一次加密:csdn
第二次加密:csdnblog
正确做法应该是:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/IKnowNothinglee/article/details/105576506