hashlib模块
一、HASH
Hash一般翻译为"散列",或音译为"哈希"。将任意长度的输入(也叫预映射,pre-image)通过散列算法,变换为固定长度的输出,这个输出就是散列值。这种转换是一种压缩映射,散列值的空间通常远小于输入的空间。不同输入可能会散列为相同输出,因此不可能从散列值来唯一确定输入值。
Hash定义:一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
Hash功能:主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值.
hash就是找到一种数据内容和数据存放地址之间的映射关系
二、MD5
1、MD5概念
MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm)。是一种被广泛使用的密码杂凑函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。MD5的前身有MD2、MD3和MD4。
2、MD5功能
(1)输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
(2)不同的输入得到的不同的结果(唯一性)
3、MD5算法的特点
压缩性:任意长度的数据,算出的MD5值的长度都是固定的
容易计算:从原数据计算出MD5值很容易
抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5算法是否可逆?
MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。
4、MD5用途:
(1)防止被篡改
(2)防止直接看到明文
比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)
(3)防止抵赖(数字签名)
这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。
三、SHA-1(安全哈希算法)
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
SHA是美国国家安全局设计的,由美国国家标准和技术研究院发布的一系列密码散列函数。位数越长,破解难度越大,但同时生成加密的消息摘要所耗时间也更长。目前最流行的是加密算法是SHA-256 .
四、MD5与SHA-1对比
MD5与SHA-1均是从MD4发展而来,它们的结构和强度等特性有很多相似之处。
SHA-1与MD5的最大区别在于其摘要比MD5摘要长32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5是2128数量级的操作,SHA-1是2160数量级的操作。产生具有相同摘要的两个报文的难度:MD5是264是数量级的操作,SHA-1 是280数量级的操作。因而,SHA-1对强行攻击的强度更大。但由于SHA-1的循环步骤比MD5多80:64且要处理的缓存大160比特:128比特,SHA-1的运行速度比MD5慢。
五、hashlib模块使用
1、python的md5加密与加盐
#md5加密是不可反解的 import hashlib #实例化对象 obj=hashlib.md5() #先创建一个md5的对象 #写入要加密的字节 obj.update("admin".encode("utf-8")) #对谁加密就把谁道前面,python3中必须是字节,所以必须用.encode() #获取密文 secret=obj.hexdigest() print(secret) ############################################################## import hashlib obj=hashlib.md5(b'12334') #实例化md5的时候可以给传个参数,这叫加盐 obj.update("admin".encode("utf-8")) #是再加密的时候传入自己的一块字节, secret=obj.hexdigest() print(secret) ############################################################## #因为用户密码已经被加密过了,而且是加盐的,所以再用户验证的时候用字符串或者直接的加密的的字节都不能正确判断,只能用加盐的字节所判断 import hashlib SALT = b'2erer3asdfwerxdf34sdfsdfs90' def md5(pwd): # 实例化对象 obj = hashlib.md5(SALT) # 写入要加密的字节 obj.update(pwd.encode('utf-8')) # 获取密文 return obj.hexdigest() user = input("请输入用户名:") pwd = input("请输入密码:") if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a': print('登录成功') else: print('登录失败')
python3中主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib m = hashlib.md5() m.update(b"Hello") m.update(b"It's me") print(m.digest()) m.update(b"It's been a long time since last time we ...") print(m.digest()) #2进制格式hash print(len(m.hexdigest())) #16进制格式hash ''' def digest(self, *args, **kwargs): # real signature unknown """ Return the digest value as a string of binary data. """ pass def hexdigest(self, *args, **kwargs): # real signature unknown """ Return the digest value as a string of hexadecimal digits. """ pass ''' import hashlib # ######## md5 ######## hash = hashlib.md5() hash.update('admin') print(hash.hexdigest()) # ######## sha1 ######## hash = hashlib.sha1() hash.update('admin') print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256() hash.update('admin') print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384() hash.update('admin') print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512() hash.update('admin') print(hash.hexdigest())