3

对于 Rockbox 的密码存储插件(用 C 编写),我需要生成初始化向量。

问题是我没有很好的随机性来源。Rockbox 提供的 random() 不是加密 RNG。而且我几乎没有任何可以访问的随机源(没有鼠标移动,......在运行 Rockbox 的 iPod 上)。

该密钥当前是通过 PBKDF2 从用户提供的密码和盐(这是一个常量前缀 + 来自 random() 的一些数据)中派生的。我认为伪随机数据对于具有 10000 次 PBKDF2 迭代的盐来说应该足够好。

但是,我从哪里获取初始化向量?如果我获取一些半随机数据(时间 + 随机())和 SHA,比如 10000 次,可以吗?我应该使用从 random() 中获取的种子来使用 arc4random 吗?

如果我实际上从不使用相同的密钥两次(每次更改存储的数据时都会重新计算盐),我什至需要 IV 吗?处理此类情况的最佳方法是什么?

编辑:只有一个用户(我,拥有 IPod),加密算法:AES-CBC 256 位。该文件仅存储各种网站的站点/帐户/密码列表。它很少被修改(每当我在网站上创建一个新帐户时),当这种情况发生时,就会生成一个新的盐和一个新的 IV。

4

3 回答 3

2

IV 不需要是随机的,它只需要对于给定的一对密钥和数据是唯一的(假设我们正在谈论 CBC 的 IV)。

因此 random() 应该可以用于此目的。

于 2011-01-14T21:32:21.783 回答
2

好消息!初始化向量不需要是随机的,它只需要每次加密都不同。所以你可以使用用户名作为盐。如果您同时使用用户名和时间,那么攻击者将无法检测到密码重用。

于 2011-01-14T21:34:03.427 回答
2

一般来说,对于 CBC,IV必须是随机且统一的。“不重复”是不够的。更准确地说,CBC 的全部意义在于避免同一数据块被两次馈送到底层块密码的情况。因此,条件是,如果您使用相同的密钥加密两条消息,那么差异两个 IV 中的一个必须是均匀随机的。使用 128 位分组密码(例如 AES),两次获得相同分组的概率足够低,可以忽略不计——只要在 128 位值的整个空间上以均匀概率随机选择 IV . IV 选择中的任何结构(例如重用相同的 IV、使用计数器或低质量的随机生成器)都会增加这种可能性,因为您正在加密本身具有很多结构的数据。

有一个好的一面:如果你从不使用相同的密钥两次,那么你可以容忍一个固定的 IV。但这是一个强烈的“从不”。

“非重复 IV”对于 CBC 来说不是一个足够好的属性。但是,有一些加密模式可以使用非重复 IV。特别是,看看EAXGCM。这里的技巧是这些模式在使用加密密钥的自定义 PRNG 中使用提供的 IV;这会将不重复的 IV(例如,计数器或低质量的“随机值”)转换为从密码学的角度来看看起来足够随机的东西。不要尝试构建自己的 PRNG!这些事情是微妙的,没有确定的方法来测试结果的质量。

于 2011-01-17T18:24:52.533 回答