python之hashlib模块
hashlib模块
算法介绍
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过,摘要的过程是不可逆的。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
import hashlib m = hashlib.md5() m.update('alex3714'.encode('utf-8')) print(m.hexdigest())
如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:
import hashlib m = hashlib.md5() m.update('alex3714'.encode('utf-8')) m.update('dazhizi sha'.encode('utf-8')) m.update('123456'.encode('utf-8')) print(m.hexdigest())
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:
import hashlib sha1 = hashlib.sha1() sha1.update('how to use sha1 in ') sha1.update('python hashlib?') print sha1.hexdigest()
现在简单的密码可以通过暴力破解进行破解,而且有时也存在撞库,这时,我们可以选择加盐的方式,就是在原有的基础上再加入特定的字符进行加密
加盐
import hashlib m = hashlib.md5('wahaha'.encode('utf-8')) m.update('123456'.encode('utf-8')) print(m.hexdigest()) # d1c59b7f2928f9b1d63898133294ad2c
也可以进行动态加盐,一般动态加盐可以使用在对用户密码的加密
import hashlib username = 'alex' m = hashlib.md5(username[:2:2].encode('utf-8')) m.update('123456'.encode('utf-8')) print(m.hexdigest()) # d1c59b7f2928f9b1d63898133294ad2c
利用hashlib的文件校验
import hashlib def check(filename): md5obj = hashlib.md5() with open(filename, 'rb') as f: content = f.read() md5obj.update(content) return md5obj.hexdigest() ret1 = check('happy') print(ret1)
#一段字符串直接进行摘要和分成几段摘要的结果是相同的。
import hashlib md5obj = hashlib.md5() md5obj.update(b'alex ') md5obj.update(b'sb') print(md5obj.hexdigest())
由于hashlib可以分开,那么当我们要读取文件内容较多的时候,也可以分开读取,不会烦边文件的内容
import hashlib def check(filename): md5obj = hashlib.md5() with open(filename, 'rb') as f: while True: content = f.read(1024) if content: md5obj.update(content) else: break return md5obj.hexdigest() ret1 = check('happy') print(ret1)
hashlib的运用场景
(1)文件的一致性校验
(2)密文验证的时候加密
(3)密文验证的时候加密
(4)md5算法 通用的算法
(5)sha算法 安全系数更高,sha算法有很多种,后面的数字越大安全系数越高,
得到的数字结果越长,计算的时间越长

浙公网安备 33010602011771号