python UDF 實現(xiàn)對csv批量md5加密操作
工作上遇到需求,一批手機號要md5加密導出。為了保證數(shù)據(jù)安全,所以沒有采用網(wǎng)上工具來加密。
md5的加密算法是開源的且成熟的,很多語言都有對應(yīng)包可以直接用,我寫了一個簡單的python來實現(xiàn),另一位同事做了一個hiveUDF來實現(xiàn),這里都給大家分享一下。
目標:
讀取csv文件,并且對其中的內(nèi)容進行md5加密,32位加密,將加密后的密文存入另一個csv文件。
python實現(xiàn):
(1)準備好要讀取的csv文件。單列,一行存一個手機號碼。
(2)python代碼:
#encoding=utf8 import hashlib #加密模塊 import os #定義一個加密函數(shù),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函數(shù)用于剔除換行符\n,不然是對“13000000\n”加密而不是對“13000000”加密 with open(writefilename,'w') as wf: for row in rf.readlines(): wf.write(md5_encryption(row.strip())) wf.write('\n') #計算一下寫入的行數(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 實現(xiàn):
(1)用java寫一個類用來實現(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
導入jar包:
hive> add jar hdfs:/user/udf/HiveUdf-1.0-SNAPSHOT.jar;
新建一個函數(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兩種實現(xiàn)md5加密的方法啦!
補充:python的MD5加密的一點坑
曾經(jīng)在做某ctf題目時,被這點坑,坑了好久。
廢話不多說,進入正題。
python MD5加密方法
import hashlib //導入hash庫函數(shù) text = "bolg.csdn.net" //要加密的文本 md5_object = hashlib.md5() //創(chuàng)建一個MD5對象 md5_object.update(text) //添加去要加密的文本 print md5_object.hexdigest() //輸出加密后的MD5值
坑在哪?
當你在進行第一次加密時,程序正常輸出MD5值,但是在同一程序中進行第二次明文加密時,如果你的代碼是這樣寫,就不會得到正確的MD5值。
通過對第一張圖片和第二張圖片的比較,發(fā)現(xiàn)如果按照第一張圖片的代碼進行連續(xù)加密時,它實質(zhì)上是在加密每次明文的疊加。
即第一次加密:csdn
第二次加密:csdnblog
正確做法應(yīng)該是:
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Python機器學習應(yīng)用之基于LightGBM的分類預測篇解讀
這篇文章我們繼續(xù)學習一下GBDT模型的另一個進化版本:LightGBM,LigthGBM是boosting集合模型中的新進成員,由微軟提供,它和XGBoost一樣是對GBDT的高效實現(xiàn),原理上它和GBDT及XGBoost類似,都采用損失函數(shù)的負梯度作為當前決策樹的殘差近似值,去擬合新的決策樹2022-01-01利用django-suit模板添加自定義的菜單、頁面及設(shè)置訪問權(quán)限
這篇文章主要給大家介紹了關(guān)于利用django-suit模板添加自定義的菜單、頁面及設(shè)置訪問權(quán)限的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧2018-07-07Pytorch如何加載自己的數(shù)據(jù)集(使用DataLoader讀取Dataset)
這篇文章主要介紹了Pytorch如何加載自己的數(shù)據(jù)集(使用DataLoader讀取Dataset)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12matplotlib之Pyplot模塊繪制三維散點圖使用顏色表示數(shù)值大小
在撰寫論文時常常會用到matplotlib來繪制三維散點圖,下面這篇文章主要給大家介紹了關(guān)于matplotlib之Pyplot模塊繪制三維散點圖使用顏色表示數(shù)值大小的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-08-08