python UDF 實(shí)現(xiàn)對(duì)csv批量md5加密操作
工作上遇到需求,一批手機(jī)號(hào)要md5加密導(dǎo)出。為了保證數(shù)據(jù)安全,所以沒(méi)有采用網(wǎng)上工具來(lái)加密。
md5的加密算法是開(kāi)源的且成熟的,很多語(yǔ)言都有對(duì)應(yīng)包可以直接用,我寫了一個(gè)簡(jiǎn)單的python來(lái)實(shí)現(xiàn),另一位同事做了一個(gè)hiveUDF來(lái)實(shí)現(xiàn),這里都給大家分享一下。
目標(biāo):
讀取csv文件,并且對(duì)其中的內(nèi)容進(jìn)行md5加密,32位加密,將加密后的密文存入另一個(gè)csv文件。
python實(shí)現(xiàn):
(1)準(zhǔn)備好要讀取的csv文件。單列,一行存一個(gè)手機(jī)號(hào)碼。

(2)python代碼:
#encoding=utf8
import hashlib #加密模塊
import os
#定義一個(gè)加密函數(shù),32位md5加密
def md5_encryption(str):
m=hashlib.md5()
m.update(str)
return m.hexdigest()
#準(zhǔn)備要讀取的csv和要被寫入的csv,兩個(gè)文件要和此python放在同一個(gè)文件夾里
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函數(shù)用于剔除換行符\n,不然是對(duì)“13000000\n”加密而不是對(duì)“13000000”加密
with open(writefilename,'w') as wf:
for row in rf.readlines():
wf.write(md5_encryption(row.strip()))
wf.write('\n')
#計(jì)算一下寫入的行數(shù)
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)結(jié)果


hive UDF 實(shí)現(xiàn):
(1)用java寫一個(gè)類用來(lái)實(shí)現(xiàn)加密,用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
導(dǎo)入jar包:
hive> add jar hdfs:/user/udf/HiveUdf-1.0-SNAPSHOT.jar;
新建一個(gè)函數(shù):
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兩種實(shí)現(xiàn)md5加密的方法啦!
補(bǔ)充:python的MD5加密的一點(diǎn)坑
曾經(jīng)在做某ctf題目時(shí),被這點(diǎn)坑,坑了好久。
廢話不多說(shuō),進(jìn)入正題。
python MD5加密方法
import hashlib //導(dǎo)入hash庫(kù)函數(shù) text = "bolg.csdn.net" //要加密的文本 md5_object = hashlib.md5() //創(chuàng)建一個(gè)MD5對(duì)象 md5_object.update(text) //添加去要加密的文本 print md5_object.hexdigest() //輸出加密后的MD5值
坑在哪?
當(dāng)你在進(jìn)行第一次加密時(shí),程序正常輸出MD5值,但是在同一程序中進(jìn)行第二次明文加密時(shí),如果你的代碼是這樣寫,就不會(huì)得到正確的MD5值。


通過(guò)對(duì)第一張圖片和第二張圖片的比較,發(fā)現(xiàn)如果按照第一張圖片的代碼進(jìn)行連續(xù)加密時(shí),它實(shí)質(zhì)上是在加密每次明文的疊加。
即第一次加密:csdn
第二次加密:csdnblog
正確做法應(yīng)該是:

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Python實(shí)戰(zhàn)之異步獲取中國(guó)天氣信息
這篇文章主要介紹了如何利用Python爬蟲異步獲取天氣信息,用的API是中國(guó)天氣網(wǎng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手試一試2022-03-03
PyCharm對(duì)接DeepSeek大模型的操作流程
以下是使用 PyCharm 對(duì)接 DeepSeek 大模型的詳細(xì)操作流程,基于 Python 開(kāi)發(fā)環(huán)境,假設(shè)你已具備 DeepSeek API 的訪問(wèn)權(quán)限(需提前申請(qǐng) API Key),需要的朋友可以參考下2025-03-03
python數(shù)據(jù)分析工具之 matplotlib詳解
對(duì)于 Python 來(lái)說(shuō),matplotlib 是最著名的繪圖庫(kù),它主要用于二維繪圖,當(dāng)然也可以進(jìn)行簡(jiǎn)單的三維繪圖。這篇文章主要介紹了python數(shù)據(jù)分析工具之 matplotlib的相關(guān)知識(shí),需要的朋友可以參考下2020-04-04
一行Python代碼實(shí)現(xiàn)為圖片上版權(quán)
不知道大家會(huì)不會(huì)遇到這樣的情況,自己辛辛苦苦整理的攻略,分享給自己的一些朋友,結(jié)果分享有人堂而皇之地拿著這份攻略圖片去引流,并聲稱是自己整理的,真是豈有此理!本文就來(lái)用Python實(shí)現(xiàn)為圖片上版權(quán),需要的可以參考一下2023-01-01

