hashlib
1.普通加密及在加密算法中添加自定义key再来做加密
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import hashlib
a = "I am a boy".encode('utf-8')
print(hashlib.md5(a).hexdigest())
print(hashlib.sha1(a).hexdigest())
print(hashlib.sha224(a).hexdigest())
print(hashlib.sha256(a).hexdigest())
print(hashlib.sha384(a).hexdigest())
print(hashlib.sha512(a).hexdigest())
low = hashlib.md5()
low.update(a)
res = low.hexdigest()
print("普通加密:", res)
high = hashlib.md5(b'zidingyi')
high.update('this is a test'.encode('utf-8'))
res = high.hexdigest() # 使用一个 32 位的 16 进制字符串表示
print("采用key加密:", res)
2.处理大文件
2.1 先看如下代码,分开处理的结果是一样的:
import hashlib
x = hashlib.md5()
x.update('hello, '.encode('utf-8'))
x.update('python'.encode('utf-8'))
x.hexdigest()
Out[3]: 'fb42758282ecd4646426112d0cbab865'
hashlib.md5('hello, python'.encode('utf-8')).hexdigest()
Out[4]: 'fb42758282ecd4646426112d0cbab865'
# 重复的调用等同于一次调用所有数据的组合
# 对于较大文件可以采取多次传输(多次调用update(bytes_obj)),这和一次性计算得到的hash值是一样的
2.2 所以,借上面的思想写了如下代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import hashlib
import os
def get_file_md5(file_name):
if not os.path.isfile(file_name): # 如果校验md5的文件不是文件,返回空
return
m = hashlib.md5()
with open(file_name, 'rb') as f:
while True:
data = f.read(1024)
if not data:
break
m.update(bytes(data))
return m.hexdigest()
f = b'/root/learn_python/check_proc.sh'
file_md5 = get_file_md5(f)
print(file_md5)
hmac
HMAC 是用于消息认证的加密哈希算法,全称是 keyed-Hash Message Authentication Code。HMAC 利用哈希算法,以一个密钥和一个消息作为输入,生成一个加密串作为输出。HMAC 可以有效防止类似 MD5 的彩虹表等攻击,比如将常见密码的 MD5 值存入数据库,可能被反向破解。
如果文件较大可以进行多次update(byte_obj)操作
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Repeated calls are equivalent to a single call with the concatenation of all the arguments:
# m.update(a); m.update(b) is equivalent to m.update(a + b).
# https://docs.python.org/3/library/hashlib.html
# https://docs.python.org/3.6/library/hmac.html
import hashlib
import hmac
# More condensed:
x1 = hashlib.md5(b'hello, python').hexdigest()
print(x1)
# print(x1.hexdigest())
# Repeated calls:
x2 = hashlib.md5()
x2.update('hello, python'.encode('utf-8'))
print(x2.hexdigest())
x3 = hashlib.md5()
x3.update('hello, py'.encode('utf-8'))
x3.update('thon'.encode('utf-8'))
print(x3.hexdigest())
# 以上加密算法虽然很厉害,但仍然存在缺陷,通过撞库可以反解。所以必要对加密算法中添加自定义key再来做加密。
x2 = hashlib.md5(b'mykey')
x2.update('hello, python'.encode('utf-8'))
print(x2.hexdigest())
# HMAC 可以有效防止类似 MD5 的彩虹表等攻击,比如将常见密码的 MD5 值存入数据库,可能被反向破解。
msg = b'hello, python'
key = b'mykey'
h = hmac.new(key, msg, digestmod='sha256')
h1 = h.hexdigest()
print(h1)
myhmac = hmac.new(key=b'mykey', digestmod='sha256')
myhmac.update(b'hello, ')
myhmac.update(b'python')
myhmac1 = myhmac.hexdigest()
print(myhmac1)
print(hmac.compare_digest(h1, myhmac1))
ssh://root@192.168.5.29:22/usr/bin/python3 -u /root/python_code/10-work.py
fb42758282ecd4646426112d0cbab865
fb42758282ecd4646426112d0cbab865
fb42758282ecd4646426112d0cbab865
13f81c194feb7824623942bcea2c503c
92f2bf4930db49efa669179f50f4584ec9c02003297b6382a6636dfa2af42cfb
92f2bf4930db49efa669179f50f4584ec9c02003297b6382a6636dfa2af42cfb
True
Process finished with exit code 0
网友评论