hashlib模块

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

 






 

 
posted @ 2019-03-18 10:33  sword23  阅读(116)  评论(0编辑  收藏  举报