1

我上一个问题的启发,现在我有了一个非常有趣的想法:您是否真的需要使用Rfc2898DeriveBytes或类似的类从密码字符串“安全地派生”加密密钥和初始化向量,或者只是该字符串的简单哈希工作在使用对称算法(例如 AES、DES 等)加密数据时,是否与密钥/IV 一样好?

我看到了大量的 AES 加密代码片段,其中Rfc2898DeriveBytes类用于从密码字符串派生加密密钥和初始化向量 (IV)。假设应该使用随机盐和大量迭代来获得足够安全的密钥/IV 用于加密。虽然使用这种方法从密码字符串中派生字节在某些情况下非常有用,但我认为这在使用对称算法加密数据时不适用!原因如下:当有可能构建预先计算的彩虹表时,使用盐是有意义的,并且当攻击者获得哈希值时,他会查找原始密码。但是......对于对称数据加密,我认为这不是必需的,因为密码字符串或加密密钥的哈希值永远不会存储在任何地方。所以,如果我们只是获取密码的 SHA1 哈希,并将其用作加密密钥/IV,那么

Rfc2898DeriveBytes当我们可以只使用该密码的 SHA1(或任何其他)散列时,使用类从密码字符串生成密钥/IV的目的是什么(这是一个非常非常耗费性能的操作)?散列会导致密钥中的随机位分布(而不是直接使用字符串字节)。无论如何,攻击者将不得不暴力破解整个密钥范围(例如,如果密钥长度为 256 位,他将不得不尝试 2^256 个组合)。

因此,要么我以一种危险的方式错了,要么所有那些使用Rfc2898DeriveBytes方法生成加密密钥和 IV 的 AES 加密样本(包括这里的许多赞成的答案)等都是错误的。

4

3 回答 3

1

如果您使用密码的散列作为加密密钥,则每次加密都会使用不同的密钥,这使得攻击者更容易攻击至少一些加密值(通过散列“password123”、“chocolate”等) . 保护对称加密的最佳方法是管理一个长而单一的密钥,因此它不会被任何人嗅探。
至于您的第一个问题,关于使用 Rfc2898DeriveBytes,这样做的目的是确保您从密码中获取的密钥以难以复制或暴力破解的方式完成。它在过程中增加了熵。如果您输入密码,然后执行简单的哈希,则用于加密的密码既弱(受限制的字符集和长度)又可预测。

于 2012-09-21T15:36:39.030 回答
1

攻击者必须暴力破解整个密钥范围(例如,如果密钥长度为 256 位,他将不得不尝试 2^256 种组合)

这就是你出错的地方。如果弱密码有 8 个字符,并且每个 ASCII 字符大约有 5 位,那么大约有 (2^5) ^ 8 个弱密码,大约是 2^40。由于您没有使用盐,因此只有 2^40 个可能的键。通过迭代 8 个字符的可能组合并对每个字符进行散列,这些键很容易生成。这比 2^256 更容易暴力破解。

于 2012-09-21T16:16:32.363 回答
0

的重点Rfc2898DeriveBytes是要慢一点。
通过重复哈希 1,000 次或更多次,您可以强制暴力尝试猜测密码的速度要慢几个数量级。

于 2012-09-21T15:29:46.380 回答