python的hashlib提供了常见的摘要算法,如MD5, SHA1等等。python
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它经过一个函数,把任意长度的数据转换成一个长度固定的数据串(一般用16进制的字符串表示)。算法
摘要算法就是经过摘要函数对任意长度的data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。数据库
摘要算法之因此能指出数据是否被篡改过,就是由于摘要函数是一个单向函数,计算data的摘要digest很容易,可是经过digest反推data却很是困难,并且,对原始数据作一个bit的修改,都会致使据算出的摘要彻底不一样。app
使用hashilib模块通常分为4步:运维
(1)在python中引用hashlib模块。函数
(2)建立一个hash对象,使用hash算法命名的构造函数,或者通用构造函数。网站
(3)使用hash对象调用update()方法填充对象加密
(4)调用digest()或者hexdigest()方法来获取摘要(加密结果)spa
import hashlib s = "How to use md5 in python hashlib?" md5 = hashlib.md5()#调用一个md5对象 #调用md5的update()方法,对参数进行加密,加密必须为bytes类型 md5.update(s.encode("utf-8")) print(md5.hexdigest())#打印加密结果
md5能够替换为其余的哈希类型。设计
将字节对象arg填充到hashlib对象中,arg一般为要加密的字符串
返回加密结果 ,它是一个字节对象,长度为md5.digest_size。
返回加密结果,它是一个字符串对象,长度为md5.digest_size*2,只包含16进制数字。
获取保证在全部平台上此模块支持的hash算法名称的集合。
获取能够运行在python解释器中的hash算法名称的集合。
(1)update()方法须要接收的参数是一个字节对象。
(2)经常使用的一些算法主要有sha1, sha224, sha256, sha384, sha512, md5等算法。
(3)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())
全部容许用户登陆的网站都会将用户登陆的用户名和密码存储在数据库中。
若是以明文保存用户口令,若是数据库泄漏,全部用户的口令就落入黑客的手中。此外,网站运维人员是能够访问数据库的,也能够获取到全部用户的口令。正确的把保存口令的方式不是存储用户的明文密码,而是存储用户密码的摘要,好比md5:
hashlib的还有一个方面的应用就是文件校验,它能够在文件传输时,验证文件是否被完整接收,这用到的是hashlib的“相同字符串的摘要一致”原理。若是摘要一致,说明文件传输完成,不然就是文件在传输过程当中丢帧。
考虑到有这个一个状况,就是有些用户喜欢用“123456”、“888888”等一些简单的口令,因而,黑客能够事先计算出这些常见口令的md5值,获得一个反推表:
这样,无需破解,只须要对比数据库的md5,黑客就得到了使用经常使用口令的用户账号。
对于用户来讲,固然不要使用过于简单的口令。同时,咱们在程序设计上对简单口令增强保护。
因为经常使用口令的md5值很容易被计算出来,因此,要确保存储的用户密码不是那些已经被计算出来的经常使用口令的md5。这一方法经过对原始口令加一个复杂字符串来实现,俗成“加盐”:
通过“salt”处理的md5口令,只要“salt”不被黑客知道,即便用户输入简单口令,也很难经过md5反推明文口令。
可是若是有两个用户都使用了相同的简单密码,好比“123456”,在数据库中,将存储两条相同的md5值,这说明两个用户的密码是同样的。
那么,有没有办法让使用相同口令的用户存储不一样的md5呢?
假定用户没法修改登陆名,就能够经过把登陆名做为“salt”的一部分来计算md5,从而实现相同口令的用户也存储相同的md5。
摘要算法在不少地方都有普遍的应用,要注意摘要算法不是加密算法,不能用于加密(由于没法经过摘要反推明文),只能用于防篡改,可是他的单向计算特性决定了能够在不存储明文密码的状况下验证用户口令。