Pythonhashlib提供了常见的摘要算法,如MD5、SHA1等等 摘要算法又称哈希算法、三列算法。他通过一个函数,把任意长度的数据转换为一个长度固定的而数据串(通常用16禁止的字符串表示) 可以通过md5值的不同来发现别人是否篡改了你的文章 import hashlib
nmd5 = hashlib.md5('how to use mad5 in python hashlib'.encode(('utf-8')))
md5 = hashlib.md5('how to use md5 in python hashlib'.encode('utf-8'))
print(md5.hexdigest())
print(nmd5.hexdigest())如果数据量很大,可以分块多次调用update(),最后计算结果是一样的 md52 = hashlib.md5()
md52.update('how to use md5 in '.encode('utf-8'))
md52.update('python hashlib'.encode('utf-8'))
print(md52.hexdigest())MD5是最常见的摘要算法,速度很快,生成结果是固定的128bit字节,通常用一个32位的16进制字符串表示。 另一种常见的摘要算法是SHA1,调用SHA1和调用MD 5完全类似: sha1 = hashlib.sha1()
sha1.update('how to use sha1 in python hashlib?'.encode('utf-8'))
print(sha1.hexdigest())
sha1的结果是160bit字节,通常用一个40位的16进制字符串表示。 比SHA1更安全的是SHA256和SHA512,不过月安全的算法不仅越慢,而且摘要的长度更长。
碰撞:
两个不同的数据通过某个摘要算法得到了相同的摘要,任何摘要算法都是把无线多的数据集合映射到一个有限的集合中,这种情况成为碰撞
练习: 当用户登录时,首先计算输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一直,说明口令输入正确,如果不一致,口令肯定错误。
db = {
'michael': 'e10adc3949ba59abbe56e057f20f883e',
'bob': '878ef96e86145580c38c87f0410ad153',
'alice': '99b1c2188db85afee403b1536010c2c9'
}
def login(user,password):
passwords=hashlib.md5(password.encode('utf-8')).hexdigest()
pwd = db[user]
if user in db.keys():
if passwords == pwd:
print ('ok')
else:
print ('密码错误')
else:
print ('用户名不存在')
login('bob','abc999')存储MD5的好处是及时运维人员能访问数据库,也无法货值用户的明文口令。 由于常用口令 的MD5很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂的字符串来实现,俗称’加盐‘
加盐算法举例 abc = hashlib.md5('123456'.encode('utf-8')).hexdigest()
print (abc)
abc_s = hashlib.md5('123456'.encode('utf-8')+'abc'.encode('utf-8')).hexdigest()
print(abc_s)
练习,根据用户输入的登录名和口令模拟用户注册,计算更安全的MD5 db2={}
def register(user,password):
db2[user] = hashlib.md5(password.encode('utf-8')+'The-Salt'.encode('utf-8')).hexdigest()
register('wdc','wdc6666')
register('djy','djy666')
register('wdy','wdy666')
print (db2)
class User():
def __init__(self,user,password):
self.user = user
self.password = password
self.salt = 'The-Salt'
def login(self):
if self.user in db2:
password_s = hashlib.md5(self.password.encode('utf-8')+self.salt.encode('utf-8')).hexdigest()
print (password_s)
if db2[self.user] == password_s:
print ('登陆成功!')
else:
print('用户名密码错误')
else:
print ('用户名尚未注册!')
user1 = User('wdc','wdc666')
user1.login()
user2 = User('wdc','wdc6666')
user2.login()摘要算法在很多地方都有很广泛的应用。
要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,
但是他的单项计算特性决定了可以再不存储明文口令的情况下验证用户口令