Bcrypt 是一种散列算法还是我的学习材料有误?

信息安全 哈希 bcrypt
2021-08-13 09:48:55

我目前正在为我的 Comptia Security+ 考试而学习,并且在在线练习测试中我得到了这个问题:


或者,表示为文本:

▶ Which of the following are hashing algorithms? (Select all that apply)
----------------------------------
👆 ✔️ ☑️  MD5 (☑️ Your answer)
👆 ✔️ ☑️  RIPEMD (☑️ Your answer)
👆 ☐ ➖  Bcrypt (❌ Your answer)
👆 ✔️ ☑️  HMAC (☑️ Your answer)
👆 ✔️ ☑️  SHA (☑️ Your answer)
----------------------------------
➖ Your answer to this question is incorrect or incomplete.

将 Bcrypt 作为散列算法包括在内是错误的吗?

4个回答

这不是一个好问题。将 bcrypt 称为“散列算法”并没有错,但他们认为它与其他算法在性质上有所不同并没有错——尽管奇怪的是他们也选择了 bcrypt 而不是 HMAC。我们可以将它们分为三类:

  • bcrypt是一个密码哈希,也称为基于密码的密钥派生函数,其目的是计算成本很高,因此即使对手平均不需要多次试验就能猜出输入是什么,测试每个猜测的成本很高。其他示例包括 PBKDF2、scrypt、Argon2 和 Balloon hash。

  • MD5、RIPEMD 和 SHA旨在成为抗冲突哈希,其目的是使查找具有相同哈希的不同消息变得困难。碰巧的是,MD5、RIPEMD、SHA-0 和 SHA-1(虽然不是 SHA-2 或 SHA-3)都被破坏了——所有这些都报告了冲突。它们还被设计为抗原像,因此很难找到具有规定哈希的消息,并且抗二次原像,因此很难找到与规定消息具有相同哈希的第二条消息; 他们都没有破坏这些属性。其他示例(与 MD5、RIPEMD 和 SHA-0/SHA-1 不同,直到今天仍未被破坏)包括 BLAKE2b 和 SHAKE128。

  • HMAC是一种从某些散列函数(如 SHA-256 )构建伪随机函数族 (PRF)消息认证码 (MAC)的技术;有时 HMAC 被松散地称为“密钥哈希”,但这并不能真正说明安全目标是什么,即作为 MAC 的不可伪造性或作为 PRF 的伪随机性:如果密钥是随机均匀选择的,那么对手不知道密钥无法猜测任何消息的 MAC,也无法将任何消息的哈希值与统一的随机位串区分开来。

密码学中的“哈希”一词仅表示对其输入或加扰输出进行加扰的函数。还有其他种类的散列函数:FNV-1 字符串散列函数,有时用于散列表;像 Poly1305 这样的通用散列系列,有保证的碰撞概率界限,有时用于制作极其便宜且安全性高的消息认证代码;密钥推导函数,如 HKDF,用于将高熵但不均匀的位串(如 Diffie-Hellman 共享秘密)转换为均匀的随机位串;等等。 调用这些“哈希”中的任何一个都没有错,但使用更具体的术语可能会有所帮助,例如抗碰撞哈希伪随机函数族通用哈希族.

奇怪的是,其中两件事与其他的不同,但显然它只是将其中一件标记为错误。

上面的所有选项都可以说是散列函数,因为它们都接受一些输入消息并产生“摘要”或“散列”:一组固定长度的高熵位,其输入是确定性的,但不可逆。但是,它们之间的输入和使用都存在差异。

MD5、RIPEMD 和 SHA(现在通常称为 SHA1)都是非常相似的一类函数,只接受一个输入(任意消息)并快速生成该消息的摘要(至少在理论上,它具有冲突和前像电阻)。它们的特定特征(无论是机械的,例如摘要的长度,还是实际的,例如安全性)各不相同,但在高层次上它们是可以互换的。

Bcrypt 需要两个额外的参数:盐和成本/工作因素。此外,它仅用于散列短字符串(密码或类似内容),并将输入长度限制为 72 个有用字节。它产生像标准哈希函数一样的输出,但(可能)更慢。

HMAC 是一种需要外部定义的散列函数的结构。作为一个函数,HMAC 需要输入消息、盐和散列函数才能使用。与 bcrypt 不同,它不会对输入消息引入任何约束——这样,它更像其他三个——但与其他所有四个不同的是,它实际上并没有指定用于计算摘要的算法,而是将该操作委托给指定的哈希函数。

总之,您可以为以下任何答案提出理由:

  • 这五个都是散列函数,因为它们接收消息并产生单向、固定长度、确定性、高熵摘要。
  • Bcrypt 是唯一一个不是散列函数的函数,因为它不能对任意长度的消息进行操作。
  • HMAC 是唯一一个不是散列函数的函数,因为它没有定义计算摘要的过程。
  • 只有 MD5、RIPEMD 和 SHA 是真正的散列函数。

显然,你的学习材料采取了第二种观点。我个人更倾向于第三种或第四种观点。HMAC-SHA-256 是一个散列函数(与“纯”函数不同,它需要一个密钥),但 HMAC 本身并不是一个散列函数。这就像说“获得面粉、盐、水和一个知道如何制作玉米饼的人;给这个人面粉、水和盐;告诉这个人制作玉米饼”是一个玉米饼食谱。

人们会发现许多“认证”问题不太理想,试图利用措辞的细微差别来测试对主题的理解,但在实际意义上却没有任何真正的意义。虽然您可以有效地在现实世界的现实中论证这一点,但面对认证测试试图评估的内容,这真的无关紧要。

从我的网络背景来看,我可以很容易地找到很多关于“分类”网络的例子。这是认证问题通常不在网络工程堆栈上的部分原因。回答为什么测试 X表明 10.250.0.0/255.255.0.0 不是有效网络(答案 - “A 类”网络的掩码为 255.0.0.0)似乎毫无意义,而实际上它与在当今世界。

也不确定为什么流行的答案都集中在“散列函数”上。认证问题问:“以下哪些是散列算法?” (强调我的)。没有提到散列函数。

因此,在所提供的五个中,有四个本身可以被认为是算法,无论它们是否内置了自己的散列函数。另一方面,bcrypt(虽然是一个函数)使用基于河豚的算法,但它本身并不是一种算法。

这可能是一个愚蠢的区别,但它又一个认证问题。

来自维基百科:

bcrypt 是 Niels Provos 和 David Mazières 设计的密码散列函数,基于 Blowfish 密码,并于 1999 年在 USENIX 上提出。

注意:密码散列算法不需要是抗冲突的,请参阅Thomas 的回答这是与加密哈希算法的区别。