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

有许多已发布的报告称,在旧版本的Android上,我们需要提供我们自己的基于SecureRandom的初始化向量(IV),因为默认值不是随机的:

  • 在Java中为AES生成IV
  • https://medium.com/@tiensinodev/basic-android-encryption-dos-and-don-ts-7bc2cd3335ff
  • https://tozny.com/blog/encrypting-strings-in-android-lets-make-better-mistakes/
  • Android加密API不会为AES生成安全IV

相反,从API Level 23开始,如果您尝试提供自己的IV,则还必须在setRandomizedEncryptionRequired(false)上调用setRandomizedEncryptionRequired(false) ,否则您将获得“加密时不允许调用者提供的IV”exception。

据推测,在线路的某个地方,Android在IV生成方面从“可怕”变为“足够好”。

什么是截止值,低于该截止值我们应该生成自己的IV而不是使用Android生成的IV?

Solutions Collecting From Web of "我们何时需要使用Android提供我们自己的随机初始化向量(IV)?"

从安全的角度来看,您应该始终提供自己的IV,因为您可以完全控制其随机化质量,并消除一个潜在的安全弱点。

关于例外,在您看来,IV是随机的和良好的。 但是从Android的角度来看,你提供的IV是固定的,因此不好,API不知道它是否是正确随机生成的。 因此, "Caller-provided IV not permitted when encrypting"的例外只是一个警告,试图警告开发人员不要使用坏IV并鼓励他们使用内置IV。

但请注意,内置IV只是构建IV的一种方法。 正如您所看到的,从API级别23开始,没有人能够保证其质量,因此最佳做法仍然是自己确保自己的IV质量。