hashlib模块
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值
import hashlib
m = hashlib.md5()
n = hashlib.sha256()
m.update('hello'.encode('utf8'))
n.update('lebron'.encode('utf8'))
print(m.hexdigest()) # 5d41402abc4b2a76b9719d911017c592
print(n.hexdigest()) # 6d7cd4295692cf696d5c12504732e7a25a094ac5bca5d847ae1e5f8bc02170a6
m.update('alvin'.encode('utf8'))
n.update('james'.encode('utf8'))
print(m.hexdigest()) # 92a7e713c30abbb0319fa07da2a5c4af
print(n.hexdigest()) # 53c6727fe96170f5eb8dac4d64400405a64560926812de390f8905b0c48121c2
m2 = hashlib.md5()
n2 = hashlib.sha256()
m2.update('helloalvin'.encode('utf8'))
n2.update('lebronjames'.encode('utf8'))
print(m2.hexdigest()) # 92a7e713c30abbb0319fa07da2a5c4af
print(n2.hexdigest()) # 53c6727fe96170f5eb8dac4d64400405a64560926812de390f8905b0c48121c2
注意:
把一段很长的数据update多次,与一次update这段长数据,得到的结果一样。但是update多次为校验大文件提供了可能。
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
import hashlib
hash = hashlib.sha256('most_valueble_player'.encode('utf8'))
hash.update('lebronjames'.encode('utf8'))
print(hash.hexdigest()) #76094d5056575dff10eac71410e53856a81f5a96b6941063c5664bff84308874
模拟撞库破解密码
import hashlib
user = {
'lebron': 'l4332',
'curry': 'c2031',
'geoger': 'g0001',
'ben': 'b0000',
'kyrie': 'k0011',
'lenard': 'l0110',
'davis': 'd0002',
'durant': 'd1222'
}
def en_code():
passwd = {}
for i in user:
n = hashlib.md5()
n.update(user[i].encode('utf8'))
passwd[i] = n.hexdigest()
return passwd
def puch(code):
for k, v in passwds.items():
if code == v:
print('用户名和密码', k, user[k])
passwds = en_code()
puch('1718794aea266e41ab3d00875956f46e')
#用户名和密码 lebron l4332
python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:
import hmac
h = hmac.new('mvp'.encode('utf8'))
h.update('lebron'.encode('utf8'))
print(h.hexdigest()) # 68f359933ed131e4e7f71af399f6e9d4
注意点:
import hmac h1 = hmac.new(b'lebron') h1.update(b'james') h1.update(b'mvp') print(h1.hexdigest()) h2 = hmac.new(b'lebron') h2.update(b'jamesmvp') print(h2.hexdigest()) h3 = hmac.new(b'lebronjamesmvp') print(h3.hexdigest()) ''' ebad7f8cd8f08189f2cf1981111ae774 ebad7f8cd8f08189f2cf1981111ae774 bbac8491cfc096a66a51288fa106d1be '''