对 RNGCryptoServiceProvider 生成的密钥使用 PBKDF2 有好处吗?

信息安全 AES 随机的 pbkdf2
2021-08-30 17:58:24

我有一个程序,它使用提供程序生成一个固定长度的 32 字节(256 位)密码RNGCryptoService,然后使用Rfc2898DeriveBytes该密码来获得一个加密密钥。

但是,为了节省系统资源,我正在考虑只使用原始密码。我对在生成的 256 位密码上使用 Rfc2898DeriveBytes 没有任何好处是对的RNGCryptoServiceProvider吗?256 位是算法(AES-256)的密钥大小,所以我应该能够使用未更改的密码。RNG 在密码学上是否足够安全,可以直接生成密钥?

2个回答

“PBKDF2”以“PB”开头,意思是“基于密码”。这是用于密码的。密码不仅仅是一个字母序列;它是一个人类可以记住和输入的字母序列一个 256 位的密钥,作为密钥应该是(使用加密强 PRNG)生成的,不是密码,即使您将其编码为字母。

另一种说法是,PBKDF2 功能的核心是应对密码的固有弱点:因为它们可以由人脑管理,所以它们很弱并且可以被暴力破解。正确的加密密钥(如您使用 生成的密钥RNGCryptoServiceProvider)没有此弱点,因此不需要 PBKDF2。

现在有一个切线用途: PBKDF2 不仅是 PB,它还是一个KDF它具有可配置的输出长度。因此,如果您的源密钥比您需要的要短,那么 KDF,尤其是 PBKDF2,可以方便地获取尽可能多的密钥材料。例如,您有一个 256 位密钥,但您需要加密检查完整性,为此您希望有一个 256 位 AES 密钥一个用于 HMAC 的 256 位密钥。要将 256 位主密钥转换为 512 位密钥材料,您需要一个 KDF。但是,PBKDF2 具有特定于密码的特性(输入是字母,而不是位;需要盐),通常不适合此类工作。SSL/TLS 用于此类工作的自定义功能(已被彻底调查,因为 SSL 是密码学家的高调目标),它称之为“PRF”。

是的,你是对的。使用使用 CSPRNG 作为加密密钥生成的随机生成的 256 位密码不会有任何问题。

RNGCryptoServiceProvider直接调用 Windows CSPRNG CryptGenRandom,因此您可以确保您的密钥是使用安全的 RNG 生成的。