Создаём зашифрованный RAR архив на PHP
Часто, в веб-проектах необходимо создавать rar архив с паролем, в котором зашифрован список файлов и папок внутри него. Многие программисты не знают, как реализовать управление таким архивом на языке php, но мы придём им на помощь, и покажем, как создать и управлять "раром" на php. Библиотека из PECL (php_rar) позволяет лишь распаковывать файлы из архива, мы же научим вас упаковывать (архивировать) файлы в rar на php, при этом кодируя, как сами файлы, так и их имена, для защиты от просмотра без ввода правильного пароля.
Нам понадобятся 5 основных функций в php коде, чтобы управлять rar файлами:
- 1. Создать новый архив rar на php (rarCreateNewArchive);
- 2. Добавить файлы в существующий архив rar и сразу зашифровать список файлов в архиве (назначив пароль) (rarAddEncryptedFiles);
- 3. Получить список файлов из существующего, зашифрованного rar архива на php (rarGetEntryList);
- 4. Удалить зашифрованные файлы из существующего rar архива на php (rarDeleteFiles);
- 5. Зашифровать определённые файлы в rar архиве на php, или зашифровать список файлов в архиве (назначив пароль) (rarSetEncryptionFiles).
Итак, начнём.
!Внизу страницы можно скачать сам код класса, в котором реализованы сами функции шифрования-дешифрования файлов в rar архиве, а здесь мы приведём пару примеров, как работать с функциями класса в ваших php файлах.
Создаём новый архив rar на php и добавляем в него наши файлы
Сразу условимся, что наши тестовые файлы, которые мы хотим добавить в rar архив на php, находятся в корневой папке сайта в подпапке '/rartest/files/'.
А тестовые архивы 'рар' мы будем создавать в подпапке '/rartest/'.
Сам файл класса 'rarpack.php' лежит тут же, в корне сайта.
В начале кода подключаем наш класс для работы с rar архивами на php:
include_once($_SERVER["DOCUMENT_ROOT"] . "/rarpack.php");
Создаём новый файл архива (если он существует, то он будет очищен и станет пустым! обратите на это особое внимание!)
$_rar_new = new rarCreateNewArchive($_SERVER["DOCUMENT_ROOT"] . "/rartest/test1.rar", "password_rar_file");
Первым параметром мы указали полный путь к новому файлу архива, вторым - пароль к самому файлу rar. Это не пароль на шифрование файлов, это именно пароль для распаковки самого файла архива.
Добавляем несколько файлов, на лету шифруя их:
$_rar_new->rarAddEncryptedFiles($_SERVER["DOCUMENT_ROOT"] . "/rartest/files/file001.txt", "password_txt_file", "file001.txt", "AES_256");
$_rar_new->rarAddEncryptedFiles($_SERVER["DOCUMENT_ROOT"] . "/rartest/files/file002.txt", "password_txt_file", "file_big.txt", "AES_256");
$_rar_new->rarAddEncryptedFiles($_SERVER["DOCUMENT_ROOT"] . "/rartest/files/file003.txt", "password_txt_file", "testfolder/file_small.txt", "AES_256");
Первый параметр, это полный путь к добавляемому файлу. Второй, это пароль для шифрования этого файла внутри архива, третий это имя файла (вместе с папкой если нужно) которое будет назначено этому файлу в самом архиве (если вы указываете папку, или несколько - то эти папки будут созданы, и, при распаковке данный файл будет помещён именно в эти папки), четвёртый параметр это метод шифрования, он не обязателен к указанию и всегда равен AES_256.
Внимание! Мы в текущем коде не устанавливаем новый пароль самому rar архиву, мы назначаем пароль закодированным файлам в этом архиве. Если Вы хотите, чтобы ваш архив при распаковке у скачавшего его пользователя просил только один пароль - устанавливайте пароль шифрования при добавлении файлов в архив такой же, как и сам пароль rar архива при его создании.
Наши файлы внутри архива зашифрованы, но их список - пока нет. Любой? кто откроет наш rar архив в программной оболочке, увидит какие же папки и файлы мы туда добавили (хоть и не сможет посмотреть их содержимое). Если вам это не нужно и вы хотите скрыть список файлов и папок, то мы зашифруем их.
Чтобы зашифровать весь список в rar архиве, просто вызовем метод без указания имени файла:
$_rar_new->rarSetEncryptionFiles("password_file_list", "AES_256");
Первый параметр - пароль (желательно указать такой же, как и сам пароль архива, чтобы не вводить разные пароли пользователю), второй - метод шифрования (всегда AES_256).
Если нужно спрятать только некоторые файлы в списке, указываем их в третьем параметре:
$_rar_new->rarSetEncryptionFiles("password_file_list", "AES_256", "file_big.txt");
$_rar_new->rarSetEncryptionFiles("password_file_list", "AES_256", "testfolder/file_small.txt");
Внимание! Указываем именно новые имена файлов в нашем архиве, которые мы указывали для них при добавлении файлов в rar.
Закроем наш архив (тем самым сохранив все его изменения на диске):
$_rar_new->Close();
Получим список зашифрованных файлов
Откроем наш (или любой другой) зашифрованный архив:
$_rar_new = new rarOpenArchive($_SERVER["DOCUMENT_ROOT"] . "/rartest/test1.rar", "password_rar_file");
Здесь пароль, который указан при создании самого файла rar.
Получим список всех записей в архиве:
$_all_entries = $_rar_new->rarGetEntryList();
if(!$_all_entries) die("Нет записей в архиве!");
Проходим по всем записям архива (зашифрованные списки файлов хранятся в этой переменой как разные записи, которые нельзя увидеть, они также не включаются в подсчет суммы записей count()):
Добавление новых файлов происходит по именам записей (новых, или уже существующих в архиве). А удаление записей, происходит по дескрипторам записей (Entries) при проходе, либо по дескриптору записи с указанием её имени.
В общем как то так, на самом деле всё гораздо проще, когда вы вникните в суть класса и поймёте, как он работает.
Вот сам код класса php:
Зашифрованный rar архив на php