Как создать и защитить ZIP‑архив паролем на Android

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

В современном мире защита личных данных стала обязательной. Один из самых простых и удобных способов – упаковать файлы в ZIP‑архив и защитить его паролем. В этой статье мы разберём:

  • Почему стоит использовать зашифрованные архивы;
  • Какие возможности предоставляет сам Android;
  • Популярные сторонние приложения (RAR, ZArchiver, 7Zipper и др.);
  • Как реализовать собственное шифрование в коде (Java/Kotlin);
  • Лучшие практики по хранению соли, вектора и зашифрованного контента.

Зачем нужен архив с паролем?

Парольный ZIP‑архив обеспечивает два уровня защиты:

  1. Конфиденциальность – без правильного пароля содержимое невозможно прочитать.
  2. Целостность – большинство архиваторов используют CRC‑контрольные суммы, которые позволяют обнаружить подмену файлов.

Это удобно, когда нужно:

  • Передать документы через мессенджеры, email или облако;
  • Сохранить резервные копии личных фотографий, финансовой информации;
  • Создать «виртуальную флешку» на телефоне, к которой можно подключать файлы и потом «размонтировать».

Встроенные возможности Android

Начиная с Android 8.0 (Oreo) в системный файловый менеджер Files by Google и в некоторых OEM‑оболочках (Samsung, Xiaomi) добавлена функция «Сжать в ZIP». Однако парольная защита в штатных средствах отсутствует. Поэтому для реального шифрования придётся пользоваться сторонними приложениями или писать собственный код.


2.1 Как создать обычный ZIP без пароля

  1. Откройте Файлы → найдите нужные файлы/папки.
  2. Выделите их (долгое нажатие → галочки).
  3. Нажмите Сжать → выберите формат ZIP.
  4. Готовый архив появится в той же папке.

Для защиты паролем используйте один из методов ниже.


Сторонние приложения

Самый быстрый способ – установить проверенное приложение из 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 напрямую (например, из биометрии).


Создание архивов с паролем на телефоне – задача, решаемая несколькими способами:

  1. Использовать проверенные сторонние приложения (RAR, ZArchiver, 7Zipper).
  2. Разработать собственный механизм шифрования, контролируя соль, IV и алгоритм (пример кода выше).
  3. Не забывать о базовых правилах безопасности: сильный пароль, хранение соли/IV в файле, удаление кэша после работы.

Следуя рекомендациям из этой статьи, вы сможете надёжно защищать свои файлы, будь то личные документы, фотографии или конфиденциальные бизнес‑данные.

Дата публикации: 04:40:08