将sha2 / sha3截断为16个字节是否比使用crc32本身更糟糕,后者本身会给出16个字节的开头?

问题描述

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

解决方法

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

截断较长的安全哈希是创建较短长度的安全哈希的一种完全可接受的方法。您还可以选择任何位子集,而不仅仅是最高位或最低位。如果不正确,则原始哈希本身将不安全,因为这将暗示输出中存在一些非随机性。

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

如果输入的密钥材料本身不是随机的,则像SHA系列之类的快速哈希可能会受到强力攻击。如果是这样,那么您就需要使用键扩展和散列,例如PBKDF2。

但是,任何情况下都不要使用CRC。它并非旨在作为安全哈希。

有关更多讨论,请参见Should I use the first or last bits from a SHA-256 hash?“SHA-256” vs “any 256 bits of SHA-512”,which is more secure?

,

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

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

我的意思是,不管输入是什么(例如,输入甚至是abcd),将sha2 / 3截断为16个字节都比使用crc32更安全。

首先,请忘记CRC,请记住,它不是密码哈希函数。

当输入空间小时,散列函数会受到图像前攻击的特殊情况。攻击者可以尝试所有可能的组合来生成密钥。您可以在此密码学中了解更多详细信息。SEQ / A

忘记了很小的输入空间!,像BitCoin Miner or SuperComputer like Summit这样的实体可以很容易地达到2 ^ 64。简而言之就是8字节。

一个人应该生成一个强密码,例如dicewireBip-39。这将为您提供容易记住的强密码。另请参见XKCD

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

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

要正确使用CBC模式,您还需要一个随机数。您也可以将HKDF或PBKDF2,Argon2等与其他信息/随机数一起使用以得出随机数。这很常见。

注意有关CBC的内容;

  • 在同一密钥下,即{Key,IV)对must be used once下,随机数必须是唯一的
  • CBC IV必须为unpredictable,但据我所知,这不是您的情况
  • CBC容易受到服务器端填充oracle攻击的攻击。您也无法做到这一点。
  • CBC模式只能提供CPA安全性,没有完整性和身份验证。要提供完整性和身份验证,请使用具有不同密钥的HMAC或组合模式。
  • 使用Authenticated Encryption With Associated Data 加密模式,例如AES-GCM和ChaCha20-Poly1305。正确使用GCM may be hard,最好使用ChaCha20-poly1305或xChaCha20-poly1305以获得更好的随机数随机生成。