1、概览
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
1)MD5的应用
import hashlib
md5 = hashlib.md5() # hashlib模块的md5()函数,创建了一个md5类
md5.update('how to use md5 in python hashlib?'.encode('utf-8')) #调用update()方法编码
print(md5.hexdigest()) #打印32位16进制的字符串
如果数据量很大,可以分块多次调用update()方法
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
2)SHA1的应用
import hashlib
sha1 = hashlib.sha1()
sha1.update('how to use sha1 in '.encode('utf-8'))
sha1.update('python hashlib?'.encode('utf-8'))
print(sha1.hexdigest())
SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。
3)加盐
对原始口令加一个复杂字符串来实现加密,俗称“加盐”
def calc_md5(password):
return get_md5(password + 'the-Salt')
2、例题
1、设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:
# -*- coding: utf-8 -*-
db = {
'michael': 'e10adc3949ba59abbe56e057f20f883e',
'bob': '878ef96e86145580c38c87f0410ad153',
'alice': '99b1c2188db85afee403b1536010c2c9'
}
import hashlib
def login(user, password):
md5=hashlib.md5()
md5.update(password.encode('utf-8'))
if md5.hexdigest()==db[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')
2、根据用户输入的登录名和口令模拟用户注册,计算更安全的MD5
db = {}
def register(username, password):
db[username] = get_md5(password + username + 'the-Salt') # 设置key的value
# -*- coding: utf-8 -*-
import hashlib, random
def get_md5(s):
return hashlib.md5(s.encode('utf-8')).hexdigest() #生成MD5值
class User(object):
def __init__(self, username, password):
self.username = username
# 生成盐。randint()生成范围内的随机整数。chr(),生成整数对应的ASCII码字符。for 循环20次
self.salt = ''.join([chr(random.randint(48, 122)) for i in range(20)])
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+user.salt)
# 测试:
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')
原文地址:http://blog.51cto.com/12758568/2117091