一般用于明文加密,其实就是一个自定义的字符编码表。原来0和1转换成字符,而现在的是字符转成另一种字符
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。具有以下三个特点:
- hash加密之后长度一样
- hash加密的东西一样则哈希结果一样
- 如果使用同一个哈希字符编码表,不断地哈希结果会累加
import hashlib
m = hashlib.md5()
m.update('hello'.encode('utf8'))
print(m.hexdigest())
# 用同一个哈希字符编码表,哈希结果会不断累加
m.update('hash'.encode('utf8'))
print(m.hexdigest()) # 返回的是hellohash的哈希值
m2 = hashlib.md5()
m2.update('hellohash'.encode('utf8'))
print(m2.hexdigest())
m3 = hashlib.md5()
m3.update('hello'.encode('utf8')) # 加密的东西一样,哈希值一样
print(m3.hexdigest())
5d41402abc4b2a76b9719d911017c592
97fa850988687b8ceb12d773347f7712
97fa850988687b8ceb12d773347f7712
5d41402abc4b2a76b9719d911017c592
撞库破解hash算法加密
hash加密算法存在一定缺陷的,即可以通过撞库可以反解,如下代码所示
# 假定它的密码一定是其中一个
pwd_list = [
'hash3714',
'hash1313',
'hash94139413',
'hash123456',
'123456hash',
'h123ash',
]
def break_pwd(hash_pwd):
for pwd in pwd_list:
m = hashlib.md5()
m.update(pwd.encode('utf8'))
if m.hexdigest() == hash_pwd:
return pwd
if __name__ == '__main__':
# 密码hash后的值
hash_pwd = '0562b36c3c5a3925dbe3c4d32a4f2ba2'
pwd = break_pwd(hash_pwd)
print('这个用户的密码是:', pwd)
这个用户的密码是: hash123456
为了防止密码被撞库,我们可以使用python中的另一hmac模块,它内部对我们创建key和内容做过某种处理后再加密。如果要保证hmac模块最终结果一致,必须保证:
- hmac.new括号内指定的初始key一样
- 无论update多少次,校验的内容累加到一起是一样的内容
import hmac
h1 = hmac.new(b'123')
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())
h2 = hmac.new(b'123')
h2.update(b'helloworld')
print(h2.hexdigest())
1c526ff87444b64b5fb220a7ae3ba62d
1c526ff87444b64b5fb220a7ae3ba62d