如何在Python中透明地读取文件并检查其哈希值?

时间:2018-08-02 11:32:28

标签: python hash io sha256

我需要从文件中读取内容。 sha256摘要是先前计算的。为确保文件未更改,我想在读取时再次计算其sha256摘要,并对照先前计算的值对其进行检查。如果值不匹配,应通知我。

执行此操作的pythonic方法是什么?我在下面发布了工作代码,但是可能有更好的方法或现有的库来实现。

1 个答案:

答案 0 :(得分:2)

import hashlib
import io

class Sha256File:
    def __init__(self, fo, hashvalue):
        self._fo = fo
        self.hashvalue = hashvalue

    def __enter__(self):
        self._m = hashlib.sha256()
        return self

    def read(self, size=-1):
        b = self._fo.read(size)
        self._m.update(b)
        return b

    def __iter__(self):
        return self

    def __next__(self):
        b = self.read()
        if b == b'':
            raise StopIteration
        return b

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type is None:
            assert self._m.hexdigest() == self.hashvalue
        self._fo.close()

hashvalue = '5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03'

with Sha256File(io.BytesIO(b'hello\n'), hashvalue) as f:
    for line in f:
        print(line)