Python模块--hashlib
一 加密算法介绍
1.1 HASH
hash,一般翻译为“散列”,也有直接英译为“哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一个固定长度的消息摘要的函数。
HASH只要用于信息安全领域中的加密算法,他把一些不同长度的信息转化为杂乱的128位的编码里(通常用16进制的字符串表示),叫做HASH值,也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。
1.2 MD5
MD5 讯息摘要演算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。MD5的前身有MD2,MD3和MD4。
MD5功能
- 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹)
- 不同的输入得到不同的结果(唯一性)
MD5的算法特点
- 压缩性:任意长度的数据,算出的MD5值的长度都是固定的
- 容易计算:从原数据计算出MD5值很容易
- 抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
- 强抗碰撞:已知原数据和MD5值,想找到一个具有相同的MD5值的数据(即伪造数据)是非常困难的
MD5算法不可逆
MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的
MD5用途
1. 防止被篡改
比如发送一份电子文档,发送前先得到一个MD5值为a,然后在对方接收到电子文档后,对方也得到一个MD5值为b,如果a与b一致代表中途未被篡改。
2. 反之直接看到明文
现在很多网站在数据库存储用户的密码时都是存储用户密码的MD5值,这样就算不法分子得到了数据库的用户名密码的MD5值,也无法得知用户的密码。
3. 防止抵赖
这需要一个第三方认证机构,例如:A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录,若以后A说这个文件不是他写的,权威机构只需要对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,则证明为A所写。这就是所谓的“数字签名”。
1.3 SHA-1
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DDS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
SHA是美国国家安全局设计的,由美国国家标准和技术研究院发布的一系列密码散列函数。
由于MD5和SHA-1与2005年被山东大学的教授王小云破解了,科学家们you推出了SHA224,SHA256,SHA384,SHA512,当然长度越长,破解难度越大,但同时生成的加密的消息摘要的时间更久。目前最流行的加密算法是SHA256。
1.4 MD5 vs 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),且要处理的缓存大(160bit:128bit),所以SHA-1的运行速度比MD5慢。
二 python中的相关模块——hashlib
Python的hashlib提供了常见的摘要算法,主要有SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5等。3.x里代替了md5模块和sha模块。
什么是摘要算法?
其实上面已经说了,这里在概述一遍。摘要算法又称哈希算法、散列算法。它通过一个摘要函数f()将任意长度的数据转换为一个长度固定的摘要digest(通常用16进制的字符串表示),目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
我们以MD5为例,计算出一个字符串的MD5值:
import hashlib md5 = hashlib.md5() md5.update(b'Hello World') print(md5.hexdigest()) # b10a8db164e0754105b7a99be72e3fe5
如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:
import hashlib md5 = hashlib.md5() md5.update(b'Hello ') md5.update(b'World') print(md5.hexdigest()) # b10a8db164e0754105b7a99be72e3fe5
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit,通常用一个32位的16进制字符串表示。下面我们展示另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:
import hashlib sha1 = hashlib.sha1() sha1.update(b'Hello World') print(sha1.hexdigest()) # 0a4d55a8d778e5022fab701977c5d840bbc486d0
SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA224、SHA256等,不过越安全的算法越慢,而且摘要长度更长。
三 加盐
以上算法虽然已经非常厉害,但依旧存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密,俗称“加盐”
import hashlib md5 = hashlib.md5(b'abcdefg1111') md5.update(b'Hello World') print(md5.hexdigest()) # ac542d9703c27080bd5ef4360a656c97
其他算法使用方法与其一致。
四 扩展
4.1 hamc模块
python 还有一个 hmac 模块,它内部对我们创建 key 和内容再进行处理,然后再加密
import hmac ha = hmac.new(b'abcdefg1111') ha.update(b'Hello World') print(ha.hexdigest()) # e38b995b3fad1b5242eae9c1b7a3cdf0
4.2 3.x废弃模块
import md5 md5 = md5.new() md5.update('Hello World') print md5.hexdigest()
import sha sha = sha.new() sha.update('Hello World') print sha.hexdigest()

浙公网安备 33010602011771号