Используйте CipherOutputStream
или CipherInputStream
с Cipher
и ваши FileInputStream
/ FileOutputStream
.
Я бы предложил что-то вроде Cipher.getInstance("AES/CBC/PKCS5Padding")
для создания класса Cipher
. Режим CBC является безопасным и не имеет уязвимостей режима ECB для неслучайных открытых текстов . Он должен присутствовать в любой универсальной криптографической библиотеке, обеспечивая высокую совместимость.
Не забудьте использовать Вектор инициализации (IV), сгенерированный безопасным генератором случайных чисел , если вы хотите зашифровать несколько файлов одним и тем же ключом. Вы можете добавить префикс IV в начале зашифрованного текста. Это всегда ровно один блок (16 байт).
Если вы хотите использовать пароль, убедитесь, что вы используете хороший механизм получения ключей (посмотрите шифрование на основе пароля или получение ключа на основе пароля). PBKDF2 - наиболее часто используемая схема получения ключей на основе пароля, и она присутствует в большинстве сред выполнения Java , включая Android. Обратите внимание, что SHA-1 является немного устаревшей хеш-функцией, но она должна быть в порядке в PBKDF2 и в настоящее время предоставляет наиболее совместимый параметр.
Всегда указывайте кодировку символов при кодировании / декодировании строк, иначе у вас возникнут проблемы, если кодировка платформы отличается от предыдущей. Другими словами, не используйте String.getBytes()
, но используйте String.getBytes(StandardCharsets.UTF_8)
.
Чтобы сделать его более безопасным, добавьте криптографическую целостность и аутентичность, добавив безопасную контрольную сумму (MAC или HMAC) поверх зашифрованного текста и IV, предпочтительно используя другой ключ. Без тега аутентификации зашифрованный текст может быть изменен таким образом, что изменение не может быть обнаружено.
Имейте в виду, что CipherInputStream
может не сообщать BadPaddingException
, включая BadPaddingException
, сгенерированные для аутентифицированных шифров, таких как GCM. Это сделало бы потоки несовместимыми и небезопасными для таких аутентифицированных шифров.