4
  1. 使用 AES/Rijndael 或任何对称加密。

  2. 使用自己作为密钥和随机 IV 加密隐藏值。

  3. 存储密文 + IV。丢弃一切。

  4. 检查哈希:尝试使用提供的明文解密。如果提供 == 已解密,则可以。

  5. 忽略密文长度问题。

这安全吗?

4

2 回答 2

3

有一种使用像 AES 这样的分组密码生成散列或 MAC 的现有方法。它被称为CBC-MAC。它的操作非常简单。只需在 CBC 模式下使用 AES 加密要散列的数据并输出密文的最后一个块,丢弃所有先前的密文块。CBC 的 IV 通常保留为零,并且 AES 密钥可用于生成 MAC。

CBC-MAC 确实有一些限制。不要使用相同的密钥和 IV 对您的数据进行加密和 MAC,否则 MAC 将简单地等于密文的最后一个块。此外,散列/MAC 的大小受限于分组密码的大小。将 AES 与 CBC-MAC 结合使用会产生 128 位 MAC,并且通常期望 MAC 至少是这个大小。

值得注意的是,CBC-MAC 是一种非常低效的 MAC 生成方式。更好的方法是在 HMAC 中使用 SHA2-256 或 SHA2-512。在我最近的测试中,在 HMAC 中使用 SHA256 产生的结果大约与 CBC-MAC 中的 AES 一样快,在这种情况下,HMAC 的宽度是其两倍。但是,新的 CPU 将使用 AES 硬件加速来生产,从而允许使用 CBC-MAC 模式下的 AES 来非常快速地生成 128 位 MAC。

于 2010-12-16T01:47:11.237 回答
2

如前所述,它有一个问题,即它揭示了关于被散列的数据长度的信息。这本身就是某种弱点。

其次......尚不清楚您是否能够检查哈希。有必要将随机生成的 IV 与散列一起存储。

我在骑自行车回家时正在考虑这个问题,然后想到了另一个可能的问题。使用典型的散列方案来存储密码,最好运行散列一堆迭代(例如,PBKDF2)。这使得进行蛮力攻击变得更加昂贵。将这种想法引入您的方案的一种可能性可能是重复循环加密数据(例如,将加密块反馈回自身)。

于 2010-12-16T00:56:04.840 回答