文章

Python练习-常用内建模块hashlib

本部分学习Python常用内置模块hashlib。主要封装了md5、sha1等常用的摘要算法。摘要算法主要用来判断文本、代码等是否被修改,以及利用其不可逆性,用于在数据库中密文保存密码。

1
2
3
4
5
6
7
8
9
10
11
12
# Python中hashlib摘要算法类库
import hashlib

md5 = hashlib.md5()
md5.update('This is a python hashlib demo'.encode('utf-8'))
print(md5.hexdigest())
md5.update('this is a python hashlib demo'.encode('utf-8'))
print(md5.hexdigest())
sha1 = hashlib.sha1()
sha1.update("This is a python ".encode("utf8"))
sha1.update("hashlib demo".encode("utf8"))
print(sha1.hexdigest())

输出如下:

1
2
3
016109b4d87fb870e8cc61fd8075a15c
1acf688f896ee8944c8d1ae3d87f5e39
e820e61f70631375dbcf508a2a2910e9c02867e2

1个数据库密码密文存储和判断的小练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 练习 设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:
# -*- coding: utf-8 -*-
db = {
    'michael': 'e10adc3949ba59abbe56e057f20f883e',
    'bob': '878ef96e86145580c38c87f0410ad153',
    'alice': '99b1c2188db85afee403b1536010c2c9'
}


def login(user, password):
    md5 = hashlib.md5()
    md5.update(password.encode("utf8"))
    md5_pass = md5.hexdigest()
    if md5_pass == db.get(user):
        return True
    else:
        return False


# 测试:
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')

考虑到对于相同的密码,摘要后的值也相同,所以可以根据用户特征,进行“加盐”。如下练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 练习2,实现加salt的登录验证
# -*- coding: utf-8 -*-
import hashlib, random


def get_md5(s):
    return hashlib.md5(s.encode('utf-8')).hexdigest()


class User(object):
    def __init__(self, username, password):
        self.username = username
        self.salt = self.username
        self.password = get_md5(password + self.salt)


db = {
    'michael': User('michael', '123456'),
    'bob': User('bob', 'abc999'),
    'alice': User('alice', 'alice2008')
}


def login(username, password):
    user = db[username]
    return user.password == get_md5(password + username)


# 测试:
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')
本文由作者按照 CC BY 4.0 进行授权