"""
哈希算法 - 哈希摘要 - 数字签名/数字指纹 - 防篡改/保护敏感信息
哈希算法是一个单向运算的函数(单向哈希函数)
通过哈希算法可以将对象计算出哈希摘要但是哈希摘要无法还原出原来的对象
Martin Fowler - 代码有很多种坏味道重复是最坏的一种
当代码已经充斥着各种坏味道的时候就需要对代码进行重构(refactor)
加密和解密 - 明文 ---加密---> 密文 ---解密---> 明文
对称加密 - 加密和解密使用同一个密钥 - DES / AES
非对称加密 - 加密和解密使用不同的密钥(公钥和私钥)- RSA
pip install pycrypto
编码和解码 - 将内存中的二进制数据处理成其他的形式 - BASE64
BASE64 - 用64个字符(a-zA-Z0-9/+)表示所有的二进制数据
110000 111010 011100 110101
00110000 00111010 00011100 00110101
"""
import hashlib
import base64
class StreamHasher(object):
def __init__(self, algorithm='md5', size=4096):
self.size = size
alg = algorithm.lower()
if alg == 'md5':
self.hasher = hashlib.md5()
elif alg == 'sha1':
self.hasher = hashlib.sha1()
elif alg == 'sha256':
self.hasher = hashlib.sha256()
elif alg == 'sha512':
self.hasher = hashlib.sha512()
else:
raise ValueError('不支持指定的哈希算法')
def __call__(self, stream):
return self.to_digest(stream)
def to_digest(self, stream):
for buf in iter(lambda: stream.read(self.size), b''):
self.hasher.update(buf)
return self.hasher.hexdigest()
def main():
sh = StreamHasher(algorithm='MD5')
with open('Python-3.7.1.tgz', 'rb') as stream:
print(sh(stream))
print(sh.to_digest(stream))
# with open('guido.jpg', 'rb') as rs:
# with open('guido.txt', 'w') as ws:
# buf = base64.b64encode(rs.read())
# ws.write(buf.decode())
# with open('guido.txt', 'r') as rs:
# with open('/Users/Hao/Desktop/gidaye.jpg', 'wb') as ws:
# buf = base64.b64decode(rs.read().encode())
# ws.write(buf)
if __name__ == '__main__':
main()
网友评论