时间:2021-05-22
工作上遇到需求,一批手机号要md5加密导出。为了保证数据安全,所以没有采用网上工具来加密。
md5的加密算法是开源的且成熟的,很多语言都有对应包可以直接用,我写了一个简单的python来实现,另一位同事做了一个hiveUDF来实现,这里都给大家分享一下。
读取csv文件,并且对其中的内容进行md5加密,32位加密,将加密后的密文存入另一个csv文件。
(1)准备好要读取的csv文件。单列,一行存一个手机号码。
(2)python代码:
#encoding=utf8import 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包
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://mon</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');OK827ccb0eea8a706c4c34a16891f84e7bTime taken: 0.139 seconds, Fetched: 1 row(s)hive> hive> select phone,MD5(phone) from mid_latong_20200414 limit 5;OK1300****436 856299f44928e90****181b0cc1758c41300****436 856299f44928e90****181b0cc1758c41300****689 771dfa9ef00f43c****4901a3f1d1fa01300****689 771dfa9ef00f43c****4901a3f1d1fa01300****689 771dfa9ef00f43c****4901a3f1d1fa0Time 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值。
通过对第一张图片和第二张图片的比较,发现如果按照第一张图片的代码进行连续加密时,它实质上是在加密每次明文的叠加。
即第一次加密:csdn
第二次加密:csdnblog
正确做法应该是:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解PythonMD5加密Python3下MD5加密#由于MD5模块在python3中被移除#在python3中使用hashlib模块进行md5操作import
java加密算法--MD5加密和哈希散列带秘钥加密算法源码最近学习加密算法的知识,利用MD5加密,百度一下网上资料很多,不是很详细,这里就整理下如何实现用MD5
因项目需要,需要Node.js与PHP做接口调用,发现node.js对中文使用md5加密与php对中文md5加密的结果不同。PHP输出:程序员md5:72d9a
基础:MessageDigest类的使用其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/***对字符串md5
python之hashlib模块:主要提供字符加密功能,python3中将md5和sha模块整合到了hashlib模块,支持md5,sha1,sha224,sh