python模块---hashlib&&hmac加密模块

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())
View Code

 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'
View Code

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('登录失败')
View Code

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'

猜你喜欢

转载自www.cnblogs.com/lilz/p/9568416.html