【转】python模块分析之hashlib加密(二)html
hashlib模块是用来对字符串进行hash加密的模块,明文与密文是一一对应不变的关系;用于注册、登陆时用户名、密码等加密使用。
一.函数分析:
1.共有5种加密算法:
md5(),sha1(),sha224(),sha256(),sha384(),sha512(),分别获得不一样的加密密文。
2.hashlib.hexdigest():获取加密的密文,16进制,无参数。
3.hashlib.digest():获取加密的密文,二进制,无参数。
4.hashlib.copy():复制一份当前建立的hash对象,无参数。
5.update(str1.encode("utf-8")):更新加密的密文,获得的密文与原来的密文不相同。python
hash.name:查看当前得到的hash对象的加密算法;算法
hash.digest_size:hash密文占多少个字节;函数
hash.block_size:hash数据块的大小。大数据
hashlib.algorithms_guaranteed:查看全部平台都支持的hash算法;网站
hashlib.algorithms_available:查看全部的hash加密算法。加密
二。运用:
1.建立哈希对象,有两种方式:
m = hashlib.new("md5",b"cai") # 选择md5加密函数加密字符串“cai”
m = hashlib.md5("cai".encode("utf-8")) # 加密的另外一种写法spa
2.特殊用法:当须要加密的字符串过大的时候,可使用同一个hash对象分屡次加密,update(a)+update(b)=update(a+b).
举例:code
1 m = hb.md5() 2 m1 = m.copy() 3 m.update("a".encode("utf-8")) 4 m.update("b".encode("utf-8")) 5 print(m.hexdigest()) # 输出密文1
6 m1.update("ab".encode("utf-8")) 7 print(m1.hexdigest()) # 输出与密文1彻底相同的密文2
3、hash算法的解密htm
加密算法获得的密文不可逆,可是密文与明文之间的关系是一一对应的,这就使得解密出现了可能,目前对于简单的、迭代次数少或不加盐处理密文,经常使用
方法是用大数据储存密文与明文的对应关系。
如经常使用的解密网站:http://www.cmd5.com/
经过输入密文查找对应的明文。
为了增大破解的难度,通常须要对密码进行屡次迭代加密和加盐处理,hashlib模块有一个专门的函数。
1 import hashlib as hb 2 import binascii 3 # sha256为算法名称,123456789为要加密的密码, 4 # salt指的是杂质,额外的东西,使得更加难破解,10000是迭代次数,能够理解成加密次数。 5 dk = hb.pbkdf2_hmac('sha256', b'123456789', b'salt', 10000) # 密码和杂质都须要是二进制类型 6 print(binascii.hexlify(dk).decode("utf-8"))
代码举例:
1 import hashlib as hb 2
3
4 def hash_fun(str1): 5 m = hb.md5(str1.encode("utf-8")) # 建立一个hash对象,并对str1加密
6 print(m.hexdigest()) # 输出获得的密文
7 m.update(str1.encode("utf-8")) # 更新密文
8 print(m.hexdigest()) # 输出更新密文,与前面再也不相同
9 print(m.digest()) # 获取字节密文
10 print(m.block_size) # 获取hash块的大小
11 print(m.digest_size) # 获取密文的字节数
12 print(m.name) # 获取加密算法的名字md5
13
14
15 def hash_fun2(str1): 16 m = hb.md5(str1.encode("utf-8")) 17 print(m.hexdigest()) 18 a = m.copy() # 拷贝一个hash对象
19 print(a.hexdigest()) # 获得的密文没改变
20
21
22 def hash_fun1(str1): 23 m = hb.sha1(str1.encode("utf-8")) # sha1算法加密
24 print(m.hexdigest()) 25 m1 = hb.sha224(str1.encode("utf-8")) # sha224算法加密
26 print(m1.hexdigest()) 27
28
29 def hash_fun3(): 30 m = hb.md5() 31 m1 = m.copy() 32 m.update("a".encode("utf-8")) 33 m.update("b".encode("utf-8")) 34 print(m.hexdigest()) 35 m1.update("ab".encode("utf-8")) 36 print(m1.hexdigest()) 37
38
39 if __name__ == '__main__': 40 hash_fun("cai") 41 print() 42 hash_fun1("cai") 43 print() 44 hash_fun2("cai") 45 print() 46 hash_fun3()
结果以下: