В современном мире защита личных данных стала обязательным требованием. На Android‑устройствах существует несколько способов создать архив‚ защищённый паролем‚ а также реализовать собственное шифрование с использованием соли и вектора инициализации (IV); В этой статье мы разберём:
- Какие приложения позволяют быстро зашифровать ZIP‑архив.
- Как реализовать собственное шифрование в коде Android (пример на Java/Kotlin).
- Где хранить соль‚ IV и зашифрованный контент в результирующем файле.
- Рекомендации по безопасности и часто задаваемые вопросы.
Готовые приложения для создания запароленных архивов
Если вам не требуется писать собственный код‚ достаточно установить одно из проверенных приложений:
- ZArchiver – бесплатный архиватор с поддержкой AES‑256 шифрования ZIP и 7z.
- RAR for Android – официальное приложение от RARLAB‚ поддерживает пароли и шифрование.
- WinRAR (Android) – платное‚ но обладает полной совместимостью с настольными версиями.
- 7Zipper – умеет работать с FTP/HTTP и поддерживает пароли.
Все перечисленные программы позволяют добавить файлы в архив‚ задать пароль и сразу получить готовый зашифрованный файл. Ниже – краткая инструкция для ZArchiver:
Шаги в ZArchiver
- Установите приложение из Google Play.
- Откройте файловый менеджер внутри ZArchiver и выберите нужные файлы/папки.
- Нажмите «Создать архив» → выберите формат
ZIPили7z. - В поле «Пароль» введите желаемый пароль‚ включите «Шифрование AES‑256» (если доступно).
- Подтвердите действие – приложение создаст архив
*.zipс встроенным шифрованием.
Самостоятельное шифрование ZIP‑архива в Android‑приложении
Если требуется более гибкое решение (например‚ добавить собственную соль и IV в файл)‚ можно воспользоваться библиотекой javax.crypto и реализовать шифрование «на лету». Ниже – пример на Java‚ адаптированный под Android 8.0+.
Что понадобится
- Android Studio (минимум API 26).
- Библиотека
commons‑compressдля создания ZIP‑архивов. - Стандартный
javax.cryptoдля AES‑CBC/CTR.
Пошаговый код
// build.gradle (app)
dependencies {
implementation 'org.apache.commons:commons-compress:1.23.0'
} Создание ZIP‑архива в памяти
public byte[] createZip(List<File> files) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream;
try (ZipArchiveOutputStream zos = new ZipArchiveOutputStream(baos)) {
for (File f : files) {
ZipArchiveEntry entry = new ZipArchiveEntry(f.getName);
zos.putArchiveEntry(entry);
Files.copy(f.toPath‚ zos);
zos.closeArchiveEntry;
}
}
return baos.toByteArray; // чистый (нешифрованный) архив
}
Генерация соли‚ ключа и IV
private static final int SALT_LENGTH = 16; // 128‑бит
private static final int ITERATIONS = 65536;
private static final int KEY_LENGTH = 256; // бит
private SecretKeySpec deriveKey(char[] password‚ byte[] salt) throws Exception {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
PBEKeySpec spec = new PBEKeySpec(password‚ salt‚ ITERATIONS‚ KEY_LENGTH);
SecretKey tmp = factory.generateSecret(spec);
return new SecretKeySpec(tmp.getEncoded‚ "AES");
}
Шифрование архива и упаковка метаданных
public byte[] encryptZip(byte[] zipData‚ char[] password) throws Exception {
// 1. Генерируем соль
SecureRandom random = new SecureRandom;
byte[] salt = new byte[SALT_LENGTH];
random.nextBytes(salt);
// 2. Получаем ключ
SecretKeySpec key = deriveKey(password‚ salt);
// 3. Генерируем IV (AES‑CBC‚ 16 байт)
byte[] iv = new byte[16];
random.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
// 4. Шифруем данные
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE‚ key‚ ivSpec);
byte[] encrypted = cipher.doFinal(zipData);
// 5. Формируем итоговый файл:
// [4 байта "MAGIC"] [16 байт SALT] [16 байт IV] [зашифрованный контент]
ByteArrayOutputStream out = new ByteArrayOutputStream;
out.write(new byte[]{0x5A‚0x49‚0x50‚0x01}); // "ZIP" + версия
out.write(salt);
out;write(iv);
out.write(encrypted);
return out.toByteArray;
}
Дешифрование (для справки)
public byte[] decryptZip(byte[] fileData‚ char[] password) throws Exception {
ByteArrayInputStream in = new ByteArrayInputStream(fileData);
byte[] magic = new byte[4];
in.read(magic);
if (magic[0] != 0x5A || magic[1] != 0x49 || magic[2] != 0x50) {
throw new IllegalArgumentException("Неправильный формат файла");
}
byte[] salt = new byte[16];
byte[] iv = new byte[16];
in.read(salt);
in.read(iv);
SecretKeySpec key = deriveKey(password‚ salt);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE‚ key‚ new IvParameterSpec(iv));
byte[] encrypted = in.readAllBytes;
return cipher.doFinal(encrypted); // чистый ZIP‑массив
}
Как сохранить полученный файл на устройстве
File outFile = new File(getExternalFilesDir(null)‚ "secret_archive.zip");
try (FileOutputStream fos = new FileOutputStream(outFile)) {
fos.write(encryptedBytes);
}Toast.makeText(this‚ "Архив сохранён: " + outFile.getAbsolutePath‚ Toast.LENGTH_LONG).show;
Где разместить соль и вектор инициализации
В примере выше они записываются непосредственно в начало файла (после 4‑байтового «MAGIC»). Такой подход прост и надёжен‚ потому что:
- Соль и IV не являются секретными – их цель – предотвратить повторное использование одинаковых ключей.
- При расшифровке достаточно прочитать первые 36 байт и восстановить параметры.
- Формат совместим с любыми программами‚ которые умеют читать пользовательские заголовки.
Рекомендации по безопасности
- Выбирайте надёжный пароль. Минимум ‚ включающих буквы разных регистров‚ цифры и специальные знаки.
- Не храните пароль в открытом виде в приложении – используйте
Android Keystoreдля временного кеширования. - Регулярно обновляйте библиотеку
commons‑compressиjavax.cryptoдо последних версий. - Если архив содержит особо чувствительные данные‚ рассмотрите двойное шифрование: сначала AES‑CBC‚ затем «обёртку» с RSA‑шифрованием публичного ключа получателя.
Часто задаваемые вопросы (FAQ)
Можно ли открыть такой архив без приложения‑шифратора?
Стандартные архиваторы (WinRAR‚ 7‑Zip) распознают только ZIP‑архивы без пользовательского заголовка. Поэтому для доступа к содержимому понадобится ваше приложение или скрипт‚ умеющий «снять» собственный .
Как восстановить пароль‚ если он утерян?
Криптографически восстановить пароль невозможно. Единственный путь – перебор (brute‑force) всех вариантов‚ что при надёжном пароле практически неосуществимо.
Поддерживает ли Android‑N (Nougat) шифрование файлов «на лету»?
Да. Начиная с Android 7.0 система предлагает File‑based Encryption (FBE)‚ но это не заменяет пользовательское шифрование архивов‚ так как FBE защищает только доступ к файлам на уровне ОС.
Создание запароленного архива на телефоне может быть реализовано двумя способами:
- С помощью готовых приложений (ZArchiver‚ RAR‚ WinRAR) – быстро и без кода.
- С помощью собственного кода‚ где вы полностью контролируете процесс генерации соли‚ IV и способа хранения метаданных.
Выбор зависит от ваших требований к гибкости и уровню безопасности. При правильном подходе даже обычный ZIP‑архив может стать надёжным контейнером для конфиденциальных файлов.
Контактная информация
Официальный сайт: https://example.com
Горячая линия: 8‑800‑555‑35‑35 (круглосуточно)
Номера телефонов:
- Техническая поддержка – +7 -95 123‑45‑67
- Отдел продаж – +7 -95 987‑65‑43
- Служба безопасности – +7 -95 555‑55‑55
Электронный адрес: support@example.com
Личный кабинет: https://example.com/account – вход по логину и паролю‚ возможность отслеживать статус запросов.
Личный приём (для юридических лиц): запись через форму https://example.com/appointment
График приёма: Пн‑Пт 08:00‑18:00‚ Сб 09:00‑14:00‚ Вс — выходной.
Отделы:
- Отдел разработки – dev@example.com
- Отдел клиентского сервиса – service@example.com
- Отдел безопасности – security@example.com
Руководство:
- Генеральный директор – Иванов И.И.
- Технический директор – Петров П.П.
- Директор по клиентскому сервису – Сидорова А.А.
Отзывы клиентов:
- «Отличный сервис‚ быстро помогли решить проблему с шифрованием файлов!» – Мария К.
- «Приложение простое в использовании‚ а поддержка отвечает в течение 5 минут.» – Алексей Л.
- «Нужна была интеграция собственного шифрования – получили готовый SDK за 2 недели.» – ООО «ТехноСервис»