Python 3 hashlib中哪种哈希可生成跨平台可移植的文件内容哈希
哈希算法选择
直接选用NIST标准化、明确定义了比特级输入处理规则的加密哈希算法即可,优先选择SHA-256或者SHA3-256:
- 这类算法的官方定义完全基于比特流操作,和硬件字节长度、编程语言实现无关,只要对照标准数学定义,哪怕是在MIX机器或者18位字长的设备上也能自行实现,计算结果完全一致。
- 绝对不要使用Python内置的
hash()函数,该函数的实现和Python版本、运行环境强绑定,不具备跨平台可复现性。
待哈希内容的处理规则(重要性高于算法选择)
你必须和接收方提前约定好以下所有比特级规则,完全消除歧义,才能保证哈希结果一致:
- 读取方式:必须使用二进制模式读取文件
绝对不要用文本模式读取文件:文本模式会自动执行行尾符转换、依赖系统默认编码解码,不同环境的处理逻辑差异极大,完全不可控。二进制模式读取得到的bytes对象是对存储内容的忠实映射,是后续处理的基础。 - 比特流映射规则
你需要和对方明确约定原始存储内容到待哈希比特流的转换方式:- 明确每个存储单元的比特顺序:比如常规8位字节的文件,约定每个字节的最高位为比特序列的前导位,按文件存储的字节顺序依次拼接所有比特。
- 非8整数倍比特长度的处理:如果文件比特长度不是8的整数倍,明确约定尾部对齐规则(比如补多少个0、补在头部还是尾部),不要在标准算法规则之外自定义填充逻辑。
- 行尾符处理规则
二选一即可,必须提前明确:- 方案1:保留原始文件的所有比特,不做任何行尾符转换,原始内容是什么就哈希什么。
- 方案2:统一转换行尾符为指定的比特序列(比如全部转换为
\n对应的比特)。
- 不要自行添加额外填充
标准SHA系列算法本身已经定义了针对任意长度比特输入的标准化填充流程,自行添加额外填充反而会引入歧义,直接使用算法自带的填充规则即可。
Python 实现示例
import hashlib FILENAME = "filename" # 二进制模式读取原始文件内容 with open(FILENAME, "rb") as f: raw_content = f.read() # 若有非8整数倍比特、行尾符转换等自定义处理,在这里按约定规则处理raw_content对应的比特流 # 计算SHA-256哈希 hasher = hashlib.sha256() hasher.update(raw_content) # 输出十六进制格式哈希值,可直接发送给接收方 print(hasher.hexdigest())
内容的提问来源于stack exchange,提问作者Ana Nimbus
相关产品推荐
相关产品推荐

