Python模块hashlib

简介

Python内置的hashlib模块提供了我们常见的摘要算法,例如 md5 , sha256 等。

那什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数 f(),把任意长度的数据 data 转换为一个长度固定的数据串 digest (通常用16进制的字符串表示)。同时我们的函数 f() 也是一个单向函数(反推及其困难),所以我们可以用摘要算法来查看数据是否被篡改过。

我日常工作中则是用来对人群包所需要的PHONE/IMEI/IDFA等信息加密。

使用

方法及属性简介
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

import hashlib

# 可以运行在Python解释器中的哈希算法名称的集合
hashlib.algorithms_available

# 保证在所有平台上此模块支持的哈希算法名称的集合
hashlib.algorithms_guaranteed

# 创建哈希对象
hashlib.md5() # and so on

# 将字节对象填充到hash对象中

hashlib.update()

# 返回二进制加密结果
hashlib.digest()

# 返回十六进制加密解决
hashlib.hexdigest()
动手实现一下

对一个文件的第二行使用md5()进行加密:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python  
#coding:utf-8
import csv
import hashlib
with open('user_md5.csv', 'w', newline='') as f:
csvwriter = csv.writer(f)
csvwriter.writerow(['md5'])
csvreader=open('userid.csv','r')
for line in csvreader:
data=[]
m=hashlib.md5()
m.update(line.strip().split(',')[1].encode('utf-8'))
encodeStr=m.hexdigest()
data.append(encodeStr)
csvwriter.writerow(data)
要加点盐

这个加密也不是绝对安全的,破解方式可以是碰撞。假设密码是生日,那我完全可以不用去逆向计算,我暴力计算现有的所有的生日经过摘要算法处理之后的值,然后去匹配即可。所以解决方法可以是加点 salt

具体实现还是很简单的,夜深了,先去休息。

参考

  1. Python3中的hashlib模块
  2. 廖雪峰的官方网站-hashlib
  3. Python模块简介 — hashlib