2019-01-25 02:52:40 +08:00
|
|
|
|
"""
|
|
|
|
|
哈希摘要 - 数字签名/指纹 - 单向哈希函数(没有反函数不可逆)
|
|
|
|
|
应用领域:
|
|
|
|
|
1. 数据库中的用户敏感信息保存成哈希摘要
|
|
|
|
|
2. 给数据生成签名验证数据没有被恶意篡改
|
|
|
|
|
3. 云存储服务的秒传功能(去重功能)
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class StreamHasher():
|
|
|
|
|
"""摘要生成器"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, algorithm='md5', size=4096):
|
|
|
|
|
"""初始化方法
|
|
|
|
|
@params:
|
|
|
|
|
algorithm - 哈希摘要算法
|
|
|
|
|
size - 每次读取数据的大小
|
|
|
|
|
"""
|
|
|
|
|
self.size = size
|
|
|
|
|
cls = getattr(__import__('hashlib'), algorithm.lower())
|
|
|
|
|
self.hasher = cls()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def digest(self, file_stream):
|
|
|
|
|
"""生成十六进制的摘要字符串"""
|
|
|
|
|
# data = file_stream.read(self.size)
|
|
|
|
|
# while data:
|
|
|
|
|
# self.hasher.update(data)
|
|
|
|
|
# data = file_stream.read(self.size)
|
|
|
|
|
for data in iter(lambda: file_stream.read(self.size), b''):
|
|
|
|
|
self.hasher.update(data)
|
|
|
|
|
return self.hasher.hexdigest()
|
|
|
|
|
|
|
|
|
|
def __call__(self, file_stream):
|
|
|
|
|
return self.digest(file_stream)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
"""主函数"""
|
|
|
|
|
hasher1 = StreamHasher()
|
|
|
|
|
hasher2 = StreamHasher('sha1')
|
|
|
|
|
hasher3 = StreamHasher('sha256')
|
|
|
|
|
with open('Python-3.7.2.tar.xz', 'rb') as file_stream:
|
|
|
|
|
print(hasher1.digest(file_stream))
|
|
|
|
|
file_stream.seek(0, 0)
|
|
|
|
|
print(hasher2.digest(file_stream))
|
|
|
|
|
file_stream.seek(0, 0)
|
|
|
|
|
print(hasher3(file_stream))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
main()
|