【问题标题】:Difference between `block_size` and `digest_size` in hashlib?hashlib中的`block_size`和`digest_size`之间的区别?
【发布时间】:2018-12-17 14:14:04
【问题描述】:

我正在浏览 Python hashlib 包文档,并希望对两个哈希对象属性(即 hash.block_sizehash.digest_size)进行一些说明。下面是每个属性的定义:

hash.digest_size= "生成的哈希大小,以字节为单位。"
hash.block_size = "哈希算法的内部块大小,以字节为单位。"
来源:https://docs.python.org/2/library/hashlib.html

所以我知道hash.digest_size 只是数据在被 hash_object 散列或“消化”后的长度或大小(以字节为单位)。例如,从下面的代码中,通过 SHA256 哈希对象获取字符串“Hello World”的摘要会返回 32 字节(或 256 位)的摘要大小。

import hashlib
hash_object = hashlib.sha256()
hash_object.update(b'Hello World')
hex_dig = hash_object.hexdigest()

print(hex_dig)
>>>a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
print(hash_object.digest_size)
>>>32
print(hash_object.block_size)
>>>64 
print(len(hex_dig))
>>>64

我不明白的是这个hash.block_size 属性。它只是表示散列数据的十六进制表示所需的字符长度吗?完全是另外一回事吗?我不太明白这个属性的定义,所以对此的任何澄清都会非常有帮助和有见地!

【问题讨论】:

  • 嗯,哈希通常是通过迭代整个文件来计算的,它以块为单位进行计算(例如每次迭代占用 64 个字节),并且每次更新某个状态(用数字表示大小为digest_size)。最后返回 digest
  • @WillemVanOnsem 啊哈明白了,这让一切变得更加清晰。谢谢
  • @WillemVanOnsem digest_size 可以小于状态大小。例如。 SHA-224 和 SHA-384 就是这样。但通常它们是相同的。更现代的散列函数通常对状态进行最终转换以产生摘要,经典的只是输出它们的最终状态。

标签: python python-3.x hashlib


【解决方案1】:

哈希是使用输入的任意长度数据计算的。大多数散列函数通过使用基于固定数据块更新内部状态的函数来执行此操作,并且您正在散列的文件(例如)以该固定块大小的块进行处理。

所以大多数散列函数都有一个固定的初始状态(通常为digest_size,但有时更大),它在初始化函数(或具有空输入的散列的构造函数)中进行初始化。对于 SHA-256(以及 SHA-224),这是 32 个字节,或者实际上是 8 个整数。

然后它以块的形式处理输入数据(对于 SHA-256,这是 64 个字节,将其转换为 16 个 32 位整数,然后对 8 个状态整数和 16 个数据整数进行较长时间的计算,之后我们有一个新的8个整数的状态。只要有输入数据,这种情况就会持续。输入块的大小是block_size

当我们想要计算一个摘要时(通常在数据的末尾),我们填充最后一个数据(如果最后一个输入块小于块大小)并将到目前为止的总散列长度放入最后64 字节(16 个整数)并从最后一次之前进行转换。然后摘要函数输出(部分)最终状态(SHA-224 仅输出 224 位 = 其 32 字节状态的 28 字节)作为摘要。最终输出的大小(以字节为单位)为digest_size

【讨论】:

  • 解释得很好,谢谢。您不仅能够回答我的问题,而且让我更好地了解如何使用像 SHA-256 这样的散列函数在幕后工作。
  • 所以你是说如果你改变block_size,同一个文件可以有不同的哈希?
  • @LeoPucciBr 哈希函数的块大小是给定的,无法更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2021-12-25
  • 2020-05-10
  • 2014-09-20
  • 2010-10-28
  • 2015-10-04
相关资源
最近更新 更多