3

我在 CBC 模式下使用 AES128,我需要一个 16 字节的密钥,所以我想知道是否使用 sha2 或 sha3 然后将其截断为 16 个字节(从左边开始取前 16 个字节)会使 sha2/sha3 比 crc32 弱这给了我开箱即用的 16 个字节。

4

2 回答 2

3

加密安全散列的每一位实际上是随机的(即独立于所有其他位)。这不适用于非加密哈希。此属性对于安全密钥至关重要。您应该始终使用加密散列进行密钥派生。

截断长的安全散列是创建较短长度的安全散列的完全可接受的方式。您还可以选择任何位子集,而不仅仅是最重要或最不重要的。如果这不是真的,那么原始哈希本身就不是安全的,因为它会暗示输出中存在一些非随机性。

SHA-2 和 SHA-3 打算成为加密安全的哈希(在这一点上,我们相信它们是)。CRC 甚至不打算在加密上是安全的。

如果输入的密钥材料本身不是随机的,那么像 SHA 系列这样的快速哈希可能会受到暴力破解。如果是这样,那么您需要使用密钥拉伸和散列,例如使用 PBKDF2。

但是你永远不应该将 CRC 用于任何这些。它并非旨在成为安全散列。

有关更多讨论,请参阅我应该使用 SHA-256 哈希的第一位还是最后一位?“SHA-256”与“任何 256 位 SHA-512”,哪个更安全?

于 2020-11-04T22:09:03.520 回答
2

我在 CBC 模式下使用 AES128,我需要一个 16 字节的密钥,所以我想知道是否使用 sha2 或 sha3 然后将其截断为 16 个字节(从左边开始取前 16 个字节)会使 sha2/sha3 比 crc32 弱这给了我开箱即用的 16 个字节。

关于如何生成 CRC 或 SHAx 的输入的问题尚不清楚。OP清除更多。因此,我在以下部分提供了答案;

我的意思是无论输入如何(比如输入甚至是 abcd ),将 sha2/3 截断为 16 个字节都会比使用 crc32 更安全。

首先,忘记CRC,它不是密码散列函数,算了。

当输入空间较小时,存在哈希函数原像攻击的特殊情况。攻击者可以尝试所有可能的组合来生成密钥。您可以在此 Cryptography.SE Q/A 中阅读更多详细信息

忘记输入空间小了!像比特币矿工或超级计算机像 Summit这样的实体可以很容易地达到 2^64。这只是说8字节。

应该生成一个强密码,如dicewireBip-39。这将为您提供易于记忆和强大的密码。另请参阅XKCD

一旦你生成了一个好的密码,你就可以将它传递给穷人的KDF1,以便更好地使用HKDF。由于您的输入材料很好,您可以跳过expandHKDF 的部分。您还可以使用基于密码的密钥派生函数,例如 Scrypt、PBKDF2 和Argon2。在这种情况下,选择 Argon2,因为它是 2015 年 7 月密码哈希竞赛的获胜者。

我只是想用 AES 128 加密游戏的声音之类的数据,并且只是想知道是否仅使用 16 字节的散列密码类密钥和 sha2/3 是比使用整个 crc32 输出更安全的解决方案。我从来没有使用过你提到的任何其他方法......

为了正确使用 CBC 模式,您还需要一个随机数。您也可以使用具有不同信息/随机数的 HKDF 或 PBKDF2、Argon2 等来导出随机数。这是很常见的。

注意那些关于CBC的;

  • nonce 在同一个 key 下必须是唯一的,即 (Key,IV) pair必须使用一次
  • CBC IV 必须是不可预测的,但是,据我所知,这不是你的情况
  • CBC 容易受到服务器端的 padding oracle 攻击。在您的情况下,这也是不可能的。
  • CBC模式只能提供CPA安全,没有完整性和认证。要提供完整性和身份验证,请使用具有不同密钥的 HMAC,或使用组合模式。
  • 经过身份验证的加密与 AES-GCM 和 ChaCha20-Poly1305 等加密的关联数据模式一起使用。正确使用GCM 可能很难,最好使用 ChaCha20-poly1305 或 xChaCha20-poly1305 以获得更好的随机数随机生成。
于 2020-11-05T13:14:27.017 回答