受我上一个问题的启发,现在我有了一个非常有趣的想法:您是否真的需要使用Rfc2898DeriveBytes
或类似的类从密码字符串“安全地派生”加密密钥和初始化向量,或者只是该字符串的简单哈希工作在使用对称算法(例如 AES、DES 等)加密数据时,是否与密钥/IV 一样好?
我看到了大量的 AES 加密代码片段,其中Rfc2898DeriveBytes
类用于从密码字符串派生加密密钥和初始化向量 (IV)。假设应该使用随机盐和大量迭代来获得足够安全的密钥/IV 用于加密。虽然使用这种方法从密码字符串中派生字节在某些情况下非常有用,但我认为这在使用对称算法加密数据时不适用!原因如下:当有可能构建预先计算的彩虹表时,使用盐是有意义的,并且当攻击者获得哈希值时,他会查找原始密码。但是......对于对称数据加密,我认为这不是必需的,因为密码字符串或加密密钥的哈希值永远不会存储在任何地方。所以,如果我们只是获取密码的 SHA1 哈希,并将其用作加密密钥/IV,那么
Rfc2898DeriveBytes
当我们可以只使用该密码的 SHA1(或任何其他)散列时,使用类从密码字符串生成密钥/IV的目的是什么(这是一个非常非常耗费性能的操作)?散列会导致密钥中的随机位分布(而不是直接使用字符串字节)。无论如何,攻击者将不得不暴力破解整个密钥范围(例如,如果密钥长度为 256 位,他将不得不尝试 2^256 个组合)。
因此,要么我以一种危险的方式错了,要么所有那些使用Rfc2898DeriveBytes
方法生成加密密钥和 IV 的 AES 加密样本(包括这里的许多赞成的答案)等都是错误的。