我们何时需要在Android中提供自己的随机初始化向量(IV)?

22
许多已发布的报告称,在旧版本的Android上,我们需要提供自己基于SecureRandom的初始化向量(IV),因为默认的IV不是随机的: 相反,从API Level 23开始,如果您尝试提供自己的IV,还必须在KeyGenParameterSpec.Builder上调用setRandomizedEncryptionRequired(false),否则会引发“加密时不允许提供调用方IV”的异常。
可以推测,在某个时刻,Android的IV生成从“糟糕”变为“足够好”。
那么,在哪个版本以下我们应该生成自己的IV而不是使用Android生成的IV呢?

当然要这样做。不这样做的意义是什么? - Jon Goodwin
@JonGoodwin:嗯,正如我所写的,您需要明确告诉KeyGenParameterSpec.Builder,您正在提供随机IV。如果您不这样做,您将会崩溃,因为Google希望KeyGenParameterSpec.Builder生成随机IV。所以,Google认为Google在这里做得很好,至少在API Level 23时是这样的。您显然不同意Google,这完全可以理解。经常不同意Google。我只是想看看是否有更多的信息可供参考。 - CommonsWare
1个回答

2
从安全角度考虑,您应该始终提供自己的IV,因为您将完全控制其随机化质量,并消除一个潜在的安全弱点。
关于异常情况,在您的角度上,IV是随机且良好的。但在Android的视角中,您提供的IV是固定的,因此不好,API无法确定它是否被正确地随机生成。因此,异常“不允许使用调用者提供的IV进行加密”只是一个一般性警告,试图警告开发人员不要使用不良IV,并鼓励他们使用内置IV。
然而,请注意,内置IV仅是构建IV的一种方法。正如您所看到的,截至API Level 23,没有人保证其质量,因此最佳实践仍然是自己确保IV的质量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接