Шифрування великих файлів у Laravel зазвичай вимагає завантаження всього файлу в пам’ять, що може перевищити ліміти PHP для файлів понад кількасот мегабайт. Laravel File Encryption, створений ercsctt, обробляє файли конфігурованими чанками з використанням AES-256-GCM автентифікованого шифрування, що дозволяє шифрувати файли будь-якого розміру без проблем із пам’яттю.
Пакет підходить для застосунків, які працюють із чутливими даними: медичними записами, фінансовими документами, файлами, що завантажують користувачі, бекапами баз даних і даними клієнтів SaaS.
# Основні можливості
Laravel File Encryption містить кілька функцій для безпечної роботи з файлами:
- AES-256-GCM автентифіковане шифрування, що забезпечує конфіденційність і перевірку цілісності
- Економне використання пам’яті через стрімінг із налаштовуваним розміром чанків (за замовчуванням 64KB)
- Колбеки прогресу для відстеження операцій шифрування/розшифрування
- Підтримка ротації ключів з автоматичним відкатом до попередніх ключів під час розшифрування
- Artisan-команди для шифрування й розшифрування файлів з CLI
- Хелпери та фасад для зручного використання в застосунку
- Бінарний формат файлу з виявленням підробок через теги автентифікації GCM
# Базове шифрування й розшифрування
Використовуйте фасад FileEncrypter для шифрування й розшифрування файлів:
use Ercsctt\FileEncryption\Facades\FileEncrypter;
// Encrypt a file
FileEncrypter::encryptFile(
'/storage/documents/contract.pdf',
'/storage/encrypted/contract.enc'
);
// Decrypt a file
FileEncrypter::decryptFile(
'/storage/encrypted/contract.enc',
'/storage/documents/contract.pdf'
);
// Get decrypted contents without writing to disk
$contents = FileEncrypter::decryptedContents('/storage/encrypted/contract.enc');
Пакет також містить хелпер decrypt_file() для отримання розшифрованого вмісту файлу.
# Підтримка стрімінгу великих файлів
За замовчуванням пакет обробляє файли чанками по 64KB, що запобігає перевантаженню пам’яті при шифруванні великих файлів. Налаштуйте розмір чанка у опублікованому конфігураційному файлі або через змінну оточення:
FILE_ENCRYPTION_CHUNK_SIZE=65536
Для файлів, більших за доступну пам’ять PHP, стрімінг дозволяє виконувати операції шифрування й розшифрування, які в іншому разі б зазнали невдачі:
// Encrypt a 2GB video file using 8MB chunks
FileEncrypter::encryptFile(
'/storage/videos/presentation.mp4',
'/storage/encrypted/presentation.enc'
);
// Process decrypted chunks without loading the entire file
FileEncrypter::decryptedStream('/storage/encrypted/large-file.enc', function ($chunk) {
// Process each decrypted chunk as it's read
echo $chunk;
});
Детальніше про Laravel File Encryption та код дивіться в репозиторії на GitHub. Пакет поширюється під ліцензією MIT.