Когда нам нужно предоставить свой собственный случайный вектор инициализации (IV) с Android?

Есть много опубликованных отчетов о том, что в старых версиях Android нам нужно предоставить собственный вектор инициализации SecureRandom -based, поскольку по умолчанию они не являются случайными:

И наоборот, с уровня API 23, если вы попытаетесь предоставить свой собственный IV, вам также необходимо вызвать setRandomizedEncryptionRequired(false) в KeyGenParameterSpec.Builder, так как в противном случае вы получаете KeyGenParameterSpec.Builder, KeyGenParameterSpec.Builder при KeyGenParameterSpec.Builder IV, которое не разрешено при шифровании.

Предположительно, где-то вдоль линии Android перешел от "ужасного" к "достаточно хорошему" с точки зрения IV поколения.

Что такое обрезание, ниже которого мы должны генерировать свой собственный IV против использования Android, генерируемого IV?

Ответ 1

С точки зрения безопасности, вы всегда должны предоставлять свой собственный IV, потому что вы бы полностью контролировали его качество рандомизации и устраняли одну потенциальную уязвимую точку безопасности.

Что касается исключения, в вашей перспективе, IV является случайным и хорошим. Но в перспективе Android ваш предоставленный IV является фиксированным и, следовательно, не очень хорошим, API не знает, правильно ли он генерируется случайным образом или нет. Таким образом, исключение "Caller-provided IV not permitted when encrypting" является просто общим предупреждением, которое пытается предупредить разработчиков о том, чтобы использовать плохой IV и поощрять их использовать встроенный IV.

Однако обратите внимание, что встроенный IV - это всего лишь один метод построения IV. Как вы можете видеть, никто не гарантирует его качество с уровня API 23, поэтому наилучшей практикой является обеспечение собственного качества IV.