Python 内建模块 ——hashlib摘要算法

本文介绍了Python的内建模块hashlib,包括MD5、SHA1等摘要算法的使用。通过摘要算法,可以检查数据是否被篡改,并在用户登录验证中用于口令的安全存储。尽管MD5速度快,但安全性较低,而SHA256和SHA512更安全但计算慢。为了增强安全性,通常会在口令计算MD5前加入‘加盐’过程。

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()
摘要算法在很多地方都有很广泛的应用。
要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,
但是他的单项计算特性决定了可以再不存储明文口令的情况下验证用户口令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值