对于Rockbox的密码存储插件(用C编写),我需要生成初始化向量。
问题在于我没有很好的随机性来源。 Rockbox提供的random()不是加密RNG。而且我几乎没有任何可随机访问的来源(没有鼠标移动,......在运行Rockbox的iPod上)。
密钥当前通过PBKDF2从用户提供的密码和salt(这是一个常量前缀+来自random()的一些数据)派生。我认为伪随机数据对于具有10000次迭代的PBKDF2的盐应该足够好。
但是,我从哪里获取初始化矢量?如果我采取一些半随机数据(时间+随机())和SHA,比如10000次,是否可以?我应该使用取自random()的种子来获取arc4random吗?
如果我实际上从不使用相同的密钥两次(每次更改存储的数据时重新计算盐),我是否还需要IV?处理这类情况的最佳方法是什么?
编辑: 只有一个用户(我拥有IPod),加密算法:AES-CBC 256位。 该文件只存储各种网站的网站/帐户/密码列表。它很少被修改(每当我在网站上创建一个新帐户时),当这种情况发生时,会生成新的盐并生成新的IV。
答案 0 :(得分:2)
IV不需要是随机的,它只需要对于给定的一对密钥和数据是唯一的(假设我们正在谈论CBC的IV)。
所以random()应该可以用于此目的。
答案 1 :(得分:2)
好消息!初始化向量不需要是随机的,只需要对每个加密都不同。因此,您可以使用用户的名称作为salt。如果您同时使用用户名和时间,则攻击者将无法检测到密码重用。
答案 2 :(得分:2)
一般来说,对于CBC,IV 必须是随机且均匀的。 “不重复”是不够的。更确切地说,CBC的整个要点是避免将相同数据块两次馈送到底层分组密码的情况。因此,条件是如果使用相同的密钥加密两个消息,则两个IV的差异必须是均匀随机的。使用诸如AES之类的128位分组密码,两次获得相同块的概率足够低以至于被忽略 - 只要在128位值的整个空间内以均匀概率随机选择IV即可。 。 IV选择中的任何结构(例如重用相同的IV,使用计数器或低质量随机生成器)都会增加这种可能性,因为您正在加密具有大量结构的数据。
有一个好的方面:如果你从不两次使用相同的密钥,那么你可以容忍一个固定的IV。但这是一个强大的“从不”。
“非重复IV”对CBC来说不够好。但是,有一些加密模式可以使用非重复IV。请特别注意EAX和GCM。这里的诀窍是那些模式在使用加密密钥的自定义PRNG中使用提供的IV;这将非重复IV(例如,低质量的计数器或“随机值”)变换为从加密的观点看起来足够随机的东西。不要试图建立自己的PRNG!这些都是微妙的,没有确定的方法来测试结果的质量。