python标准库之数据加密

python标准库中的hashlib模块提供了字符加密功能,包含MD5和SHA的加密算法,具体支持md5、sha1、sha224、sha256、sha384、sha512等算法。该模块在用户登录认证方面应用广泛,对文本加密也很常见。

一、基本调用方法

注意:向对象中传入字符串时,必须为编码类型。可以使用字符串前b’ ‘的方法或使用.encode(‘UTF-8’)的方法,使字符串变为bytes类型。

1
2
3
4
5
6
7
8
9
10
11
12
import hashlib

demo1 = hashlib.md5() # 创建hashlib的md5对象
demo1.update('hello world'.encode('utf-8')) # 将字符串载入到md5对象中, 获得md5算法加密
print(demo1.hexdigest()) # 通过hexdigest()方法, 获得new_md5对象的16进制md5显示

demo2 = hashlib.md5()
demo2.update(b'hello world')
print(demo2.hexdigest())

demo3 = hashlib.new('md5', b'hello world').hexdigest()
print(demo3)

可以创建的加密算法有:md5、sha1、sha224、sha256、sha384、sha512

1
2
3
4
5
6
7
8
import hashlib

new_md5 = hashlib.md5()
new_sha1 = hashlib.sha1()
new_sha224 = hashlib.sha224()
new_sha256 = hashlib.sha256()
new_sha384 = hashlib.sha384()
new_sha512 = hashlib.sha512()

二、加”盐”方法

md5算法有如下特点:

  • 压缩性:任意长度的数据,算出的MD5值的长度都是固定的。
  • 容易计算:从原数据计算出的MD5值很容易。不管数据多大,很快就能算出一串MD5字符串来。
  • 抗修改性:对原数据进行任何改动,哪怕修改任何一个字节,生成的MD5值也有会很大的区别。
  • 强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

既然MD5每次生成的值都是固定的,那么如果通过碰撞方法对字符串生成MD5后与MD5值碰撞,是不是就会得到MD5对应的字符串了呢?答对了!这样是可以的,换句话说,如果某用户数据库泄露了,拿到了密码库中的MD5就能通过碰撞的方法将密码破解出来。我们用一个小小的技巧,让这个碰撞方法失效,这个方法就是”加盐”。
“加盐”就是对原密码添加额外的字符串,然后再生成MD5值,这样就没有办法进行破解了,除非拿到”加盐”字符串。

1
2
3
4
5
6
7
8
import hashlib

yan = '!@#$%^' # 定义加盐字符串
pwd = 'hello world'

md5_pwd = hashlib.md5()
md5_pwd.update((pwd+yan).encode('UTF-8')) # 加盐
print(md5_pwd.hexdigest())