В современном мире защита личных данных стала обязательной. Один из самых простых и удобных способов – упаковать файлы в ZIP‑архив и защитить его паролем. В этой статье мы разберём:
- Почему стоит использовать зашифрованные архивы;
- Какие возможности предоставляет сам Android;
- Популярные сторонние приложения (RAR, ZArchiver, 7Zipper и др.);
- Как реализовать собственное шифрование в коде (Java/Kotlin);
- Лучшие практики по хранению соли, вектора и зашифрованного контента.
Зачем нужен архив с паролем?
Парольный ZIP‑архив обеспечивает два уровня защиты:
- Конфиденциальность – без правильного пароля содержимое невозможно прочитать.
- Целостность – большинство архиваторов используют CRC‑контрольные суммы, которые позволяют обнаружить подмену файлов.
Это удобно, когда нужно:
- Передать документы через мессенджеры, email или облако;
- Сохранить резервные копии личных фотографий, финансовой информации;
- Создать «виртуальную флешку» на телефоне, к которой можно подключать файлы и потом «размонтировать».
Встроенные возможности Android
Начиная с Android 8.0 (Oreo) в системный файловый менеджер Files by Google и в некоторых OEM‑оболочках (Samsung, Xiaomi) добавлена функция «Сжать в ZIP». Однако парольная защита в штатных средствах отсутствует. Поэтому для реального шифрования придётся пользоваться сторонними приложениями или писать собственный код.
2.1 Как создать обычный ZIP без пароля
- Откройте Файлы → найдите нужные файлы/папки.
- Выделите их (долгое нажатие → галочки).
- Нажмите Сжать → выберите формат ZIP.
- Готовый архив появится в той же папке.
Для защиты паролем используйте один из методов ниже.
Сторонние приложения
Самый быстрый способ – установить проверенное приложение из Google Play. Ниже перечислены самые популярные варианты.
3.1 RAR (by RARLAB)
- Поддерживает форматы RAR, ZIP, 7z;
- Создание пароля – File → Add → Set password;
- Можно хранить архивы в облаке, на USB‑накопителях (OTG).
3.2 ZArchiver
- Лёгкий, без рекламы;
- Поддержка AES‑256 для ZIP‑архивов (режим Encrypt);
- Позволяет добавить salt и IV в метаданные (см. раздел 4).
3.3 7Zipper
- Работает с 7z, ZIP, RAR, TAR, GZ и другими форматами;
- Шифрование AES‑256, возможность задавать пароль при создании;
- Поддержка FTP/HTTP‑хранилищ.
3.4 Другие варианты
Если вам нужен более «корпоративный» уровень защиты, обратите внимание на приложения LUKS Manager (создание зашифрованных контейнеров) или EDS Lite (контейнеры TrueCrypt/Veracrypt).
Программный способ: шифрование ZIP‑архива в Android‑приложении
Если вы разрабатываете собственное приложение и хотите полностью контролировать процесс (включая запись соли и вектора в файл), используйте комбинацию ZipOutputStream + CipherOutputStream с алгоритмом AES‑CBC (или AES‑GCM).
4.1 Что нужно подготовить
- Пароль, введённый пользователем;
- Случайную соль (16 байт) – используется для генерации ключа;
- Инициализационный вектор IV (16 байт) – нужен для режима CBC/GCM;
- Алгоритм PBKDF2 (HmacSHA256) для вывода 256‑битного ключа из пароля + соли.
4.2 Полный пример на Kotlin
import android.content.Context
import java.io.*
import java.security.SecureRandom
import java.security.spec.KeySpec
import javax.crypto.Cipher
import javax.crypto.CipherOutputStream
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.PBEKeySpec
import javax.crypto.spec.SecretKeySpec
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
fun createPasswordProtectedZip(
context: Context,
files: List<File>,
outputZip: File,
password: CharArray
) {
// 1. Генерируем соль и IV
val random = SecureRandom
val salt = ByteArray(16).also { random.nextBytes(it) }
val iv = ByteArray(16).also { random.nextBytes(it) }
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
val spec: KeySpec = PBEKeySpec(password, salt, 100_000, 256)
val tmp = factory.generateSecret(spec)
val secretKey = SecretKeySpec(tmp.encoded, "AES")
// 3. Настраиваем Cipher (AES/CBC/PKCS5Padding)
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(iv))
// 4. Открываем поток к файлу‑архиву
FileOutputStream(outputZip).use { fos ->
// Сначала пишем заголовок: SALT(16) + IV(16)
fos.write(salt)
fos.write(iv)
// Затем оборачиваем в CipherOutputStream
CipherOutputStream(fos, cipher).use { cos ->
ZipOutputStream(BufferedOutputStream(cos)).use { zos ->
for (file in files) {
FileInputStream(file).use { fis ->
val entry = ZipEntry(file.name)
zos.putNextEntry(entry)
fis.copyTo(zos, bufferSize = 8192)
zos.closeEntry
}
}
}
}
}
}
В результате получаем файл, в котором первые 32 байта – salt и IV, а дальше идёт зашифрованный ZIP‑контент.
4.3 Как расшифровать
fun openPasswordProtectedZip(
context: Context,
encryptedZip: File,
password: CharArray,
destinationDir: File
) {
FileInputStream(encryptedZip).use { fis ->
// Читаем соль и IV
val salt = ByteArray(16)
val iv = ByteArray(16)
fis.read(salt)
fis.read(iv)
// Генерируем ключ (тот же процесс, что и при шифровании)
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
val spec: KeySpec = PBEKeySpec(password, salt, 100_000, 256)
val tmp = factory.generateSecret(spec)
val secretKey = SecretKeySpec(tmp.encoded, "AES")
// Настраиваем Cipher для расшифровки
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
cipher.init(Cipher.DECRYPT_MODE, secretKey, IvParameterSpec(iv))
CipherInputStream(fis, cipher).use { cis ->
ZipInputStream(BufferedInputStream(cis)).use { zis ->
var entry = zis.nextEntry
while (entry != null) {
val outFile = File(destinationDir, entry.name)
FileOutputStream(outFile);use { os ->
zis.copyTo(os, bufferSize = 8192)
}
zis.closeEntry
entry = zis.nextEntry
}
}
}
}
}
Обратите внимание, что в примерах используется PBKDF2WithHmacSHA256 с 100 000 итераций – этого достаточно для большинства современных смартфонов.
4.4 Почему важно хранить salt и IV в файле
- Salt делает невозможным использование готовых радужных таблиц (rainbow tables) для вашего пароля.
- IV гарантирует, что одинаковый файл, зашифрованный одинаковым паролем, будет иметь разный зашифрованный вид.
- Хранить их в начале файла – простейший и совместимый способ; при расшифровке их читаем, а потом сразу используем.
Практические рекомендации
- Выбирайте надёжный пароль: минимум , смешивание букв, цифр и спецсимволов.
- Не сохраняйте пароль в открытом виде в приложении – используйте
EncryptedSharedPreferencesилиKeystore. - Регулярно обновляйте соль (создавайте новый архив, если меняете пароль).
- Если архив хранится в облаке, включите двухфакторную аутентификацию у провайдера.
- Для больших файлов (>100 МБ) рекомендуется использовать потоковую запись (как в примерах выше), чтобы не перегружать оперативную память.
5.1 Как «размонтировать» виртуальный диск
Если вы используете приложение, которое эмулирует флешку (например, FolderSync + Virtual Disk), после завершения работы обязательно нажмите Unmount. Это гарантирует, что все буферы записаны и файл закрыт, а также предотвращает утечку незашифрованных данных в кэш.
5.2 Совместимость с другими устройствами
ZIP‑архивы, зашифрованные по стандарту AE‑2 (WinZip AES), могут открываться в Windows, macOS и большинстве десктоп‑программ. Если вы используете собственный формат (salt+IV+AES‑CBC), убедитесь, что ваш Android‑клиент и десктоп‑утилита используют одинаковый алгоритм.
Часто задаваемые вопросы (FAQ)
Вопрос: Можно ли задать пароль в обычном файловом менеджере Android?
Нет. Стандартные менеджеры позволяют лишь сжать файлы, но не добавить пароль. Для этого нужны сторонние приложения или собственный код.
Вопрос: Чем отличаются ZIP‑пароль и шифрование AES?
Классический ZIP‑пароль использует слабый алгоритм ZipCrypto, который легко взломать. AES‑шифрование (AES‑128/256 в режиме CBC или GCM) считается надёжным при правильной реализации.
Вопрос: Как проверить, что архив действительно зашифрован?
Откройте его в любом архиваторе (WinRAR, 7‑Zip). Если появляется запрос пароля, а в свойствах указано AES‑256 – всё правильно. Если запрос пароля появляется, но в свойствах указано ZipCrypto – пере‑создайте архив с AES.
Вопрос: Можно ли зашифровать архив без пароля, а только с ключом?
Да. В примерах выше ключ генерируется из пароля, но вы можете передать готовый SecretKeySpec напрямую (например, из биометрии).
Создание архивов с паролем на телефоне – задача, решаемая несколькими способами:
- Использовать проверенные сторонние приложения (RAR, ZArchiver, 7Zipper).
- Разработать собственный механизм шифрования, контролируя соль, IV и алгоритм (пример кода выше).
- Не забывать о базовых правилах безопасности: сильный пароль, хранение соли/IV в файле, удаление кэша после работы.
Следуя рекомендациям из этой статьи, вы сможете надёжно защищать свои файлы, будь то личные документы, фотографии или конфиденциальные бизнес‑данные.
Дата публикации: 04:40:08