# Python的hashlib提供了常见的摘要算法.如MD5, SHA1等.
# 摘要算法, 又称为哈希算法, 散列算法.它通过一个函数, 把任意长度的数据转换为一个长度固定的字符串.
# 通常用16进制的字符串来表示.
# 摘要算法主要应用在判断数据有没有被篡改过.因为摘要函数是一个单向的函数,计算f(data)很容易.反之非常困难.
import hashlib
md5 = hashlib.md5()
md5.update('how to user md5 in python hashlib?'.encode('utf-8'))
print(md5.hexdigest())
# 如果数据量很大, 可以很多次调用update方法.
# MD5是最常见的摘要算法, 速度很快.生成固定的128bit==> 每4bit可以表示成一个16进制数, 所以128 / 4 = 32个16进制数
# 所以通常用一个32个字符的16进制字符串表示.
# 通常用32个字符的16进制字符串表示.记住其实128位!!!.
# SHA1与MD5类似, 其生成固定的160bit字节.通常用一个40个字符的16进制表示.
# 比SHA1更加安全的算法是SHA256, SHA512.不过越安全,算法越慢.而且摘要越长.
sha1 = hashlib.sha1()
sha1.update('how to use sha1 in '.encode('utf-8'))
sha1.update('python hashlib?'.encode('utf-8'))
print(sha1.hexdigest())
# 摘要算法应用
# 摘要算法能应用到什么地方.如允许用户登入的网站
# 都会存储用户名和口令.方法是存到数据库中.如果用明文保存用户口令, 一旦数据库泄露,就没有安全可言
# 正确的保存口令的方式是存储用户口令的摘要.当用户登入的时候, 首先计算用户输入的明文口令MD5.然后
# 和数据库中的MD5做比较.如果一致, 说明口令正确.如果不一致, 说明口令错误.
# 更进一步, 通常用户口令的MD5值是很容易被计算出来的, 所以确保存储的用户口令不是哪些被计算出的常用口令的MD5, 这一方法通过对原始口令
# 加一个复杂的字符串来实现, 俗称'加盐'.
# def calc_md5(password):
# return get_md5(password + 'the-Salt')
#
# 只要Salt不被黑客知道, 即使用户输入简单的口令, 也很难通过MD5反推出明文.
#Question: 如果两个用户使用了相同的简单口令, 比如123456.在数据库宏将存储两个一样的MD5
# 有没有办法使用相同的口令存储不同的MD5.
# 这是有前提的, 前提就是用户名是唯一的, 那么我们可以通过把登入名最为哦Salt的一部分来计算MD5.
# 从而实现相同的口令的用户存储不同的MD5.
# 练习: 根据用户输入的登入名和口令模拟用户的注册, 计算更加安全的MD5
db = {}
salt = 'sixleaves'
def get_md5(salted_string):
md5 = hashlib.md5()
md5.update(salted_string.encode('utf-8'))
return md5.hexdigest()
def register(username, password):
db[username] = get_md5(password + username + salt)
def login(username, password):
md5digest = get_md5(password + username + salt)
md5digest_in_db = db[username]
if md5digest == md5digest_in_db:
print('welcome my lord!')
else:
print('login failed!')
register('suweipeng', '123456')
login('suweipeng', '123456')
网友评论