1 hashlib模块
1.1 了解hash
1、 什么叫hash: hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值 # 2、hash值的特点是: #2.1 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验 #2.2 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码 #2.3 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的 |
hash算法就像一座工厂,工厂接收你送来的原材料(可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值
1.2 案例
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
1 import hashlib 2 3 # 实例化对象 4 md5 =hashlib.md5() 5 # 写入要加密的字节 6 md5.update('I am boy'.encode('utf-8')) 7 # 获取密文 8 print(md5.hexdigest()) #9ac0ee6cdfec58b14da9ecc9e8254377#打印十六进制的加密值 9 10 11 12 13 14 import hashlib 15 # ######## md5 ######## 16 hash = hashlib.md5() 17 hash.update('admin'.encode('utf-8')) 18 print(hash.hexdigest()) #21232f297a57a5a743894a0e4a801fc3 19 # ######## sha1 ######## 20 hash = hashlib.sha1() 21 hash.update('admin'.encode('utf-8')) 22 print(hash.hexdigest()) #d033e22ae348aeb5660fc2140aec35850c4da997 23 24 # ######## sha256 ######## 25 hash = hashlib.sha256() 26 hash.update('admin'.encode('utf-8')) 27 print(hash.hexdigest()) 28 # ######## sha384 ######## 29 hash = hashlib.sha384() 30 hash.update('admin'.encode('utf-8')) 31 print(hash.hexdigest()) 32 # ######## sha512 ######## 33 hash = hashlib.sha512() 34 hash.update('admin'.encode('utf-8')) 35 print(hash.hexdigest()) |
hashlib用法如下:
1 #导入hashlib模块 2 >>> import hashlib 3 4 #python可用的加密函数 5 >>> hashlib.algorithms_available 6 {'sha384', 'DSA', 'SHA224', 'sha1','sha224', 'SHA384', 'ripemd160', 'MD5', 'whirlpool', 'SHA', 'MD4', 'SHA512','ecdsa-with-SHA1', 'dsaWithSHA', 'md5', 'sha256', 'DSA-SHA', 'SHA1', 'RIPEMD160','sha', 'md4', 'SHA256', 'dsaEncryption', 'sha512'} 7 8 #python在所有平台上都可以使用的函数,也就是比较稳定的函数 9 >>> hashlib.algorithms_guaranteed 10 {'md5', 'sha256', 'sha384', 'sha1','sha224', 'sha512'} 11 12 #创建一个加密函数对象 13 >>> m = hashlib.md5() 14 >>> m.update(b'python isinteresting') 15 >>> m.hexdigest() 16 'f00243cac6d9aa2d320ed5603061483b' 17 18 >>> mySha1 = hashlib.sha1() 19 >>> mySha1.update(b'python is interesting') 20 >>> mySha1.hexdigest() 21 '6ad9d2ccb5fe1d5324092bdac233b4ee49d71cb8' 22 23 24 #如果有中文的话,使用gb2312编码 25 >>> myMd5 = hashlib.md5('python 真好玩'.encode('gb2312')) 26 >>> myMd5.hexdigest() 27 '6c0f33c5f4b96f1aa771bf432ba53002'
1.3 缺陷:撞库
md5在线解密: http://www.cmd5.com/
这种方式的解密并非真正意义上的解密。因为我们的一些常用的密码等会被人hash放在库里,这样与库比对就可以了
1.4 解决撞库问题 (面里面加点盐)
obj = hashlib.md5() # 没有参数的情况下就是没有 加盐
obj = hashlib.md5( b'hueufh787uey7fe8fhhc8' ) # 加盐就是参数中 b"....." 里面可以是任意的.
案例:
1 import hashlib 2 3 SALT = b'2erer3asdfwerxdf34sdfsdfs90' #不要随意更改 4 5 def md5(pwd): 6 # 实例化对象 7 obj = hashlib.md5(SALT) #面里面撒点盐 8 # 写入要加密的字节 9 obj.update(pwd.encode('utf-8')) 10 # 获取密文 11 return obj.hexdigest() # 21232f297a57a5a743894a0e4a801fc3 # 66fbdc0f98f68d69cd458b0cee975fe3 # c5395258d82599e5f1bec3be1e4dea4a 12 13 14 user = input("请输入用户名:") 15 pwd = input("请输入密码:") 16 if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a': 17 print('登录成功') 18 else: 19 print('登录失败') |
2 hmac模块
2.1 认识hmac模块
hashlib : 不可逆加密
hmac : 不可逆键值对方式加密
base64: 可逆加密
hmac模块是在内部创建key和内容处理之后加密
hmac模块也是用来生成hash值得模块,与之前的模块的不同之处在于他需要一个key用法如下
h = hmac.new(key)
h.update(string)
h.hexdigest()
案例:
1 import hmac 2 h = hmac.new('alvin'.encode('utf8')) 3 h.update('hello'.encode('utf8')) 4 print (h.hexdigest())#320df9832eab4c038b6c1d7ed73a5940 |
hmac用法如下:
>>> import hmac
>>> myhmac = hmac.new(b'mykey')
>>> myhmac.update(b'mymessage')
>>> myhmac.hexdigest()
'd811630c4e62c6ef90d1bfe540212aaf'