Saltar al contenido

Cree un archivo zip cifrado con PHP

Solución:

Nota: esta respuesta recomienda un método criptográfico que se sabe que no es seguro, incluso con una buena contraseña. Consulte el enlace de los comentarios y el control de calidad de Winzip en AES. El soporte para el cifrado zip AES en php llega con php 7.2 (y libzip 1.2.0), lo que significa que esta respuesta pronto también estará desactualizada. Hasta entonces, vea esta respuesta sobre cómo llamar a 7z en lugar del comando zip, que admite el cifrado AES de winzip.

Puedes usar esto:

<?php echo system('zip -P pass file.zip file.txt'); ?>

Donde pass es la contraseña, y file.txt se comprimirá en file.zip. Esto debería funcionar en Windows y Linux, solo necesita obtener una versión gratuita de zip para Windows (http://www.info-zip.org/Zip.html#Win32)

Este tipo de seguridad se puede romper con ataques de fuerza bruta, ataques de diccionario, etc. Pero no es tan fácil, especialmente si elige una contraseña larga y difícil de adivinar.

A partir de php 7.2 (que se lanzó hace unas horas), la forma correcta de hacerlo es utilizar la funcionalidad adicional incluida en el código php nativo de ZipArchive. (gracias a abraham-tugalov por señalar que se avecinaba este cambio)

Ahora la respuesta simple se parece a esto:

<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) {
    $zip->setPassword('secret_used_as_default_for_all_files'); //set default password

    $zip->addFile('thing1.txt'); //add file
    $zip->setEncryptionName('thing1.txt', ZipArchive::EM_AES_256); //encrypt it

    $zip->addFile('thing2.txt'); //add file
    $zip->setEncryptionName('thing2.txt', ZipArchive::EM_AES_256); //encrypt it

    $zip->close();

    echo "Added thing1 and thing2 with the same passwordn";
} else {
    echo "KOn";
}
?>

Pero también puede configurar el método de cifrado por índice y no por nombre, y puede configurar cada contraseña por archivo … así como especificar opciones de cifrado más débiles, utilizando las opciones de cifrado recientemente admitidas.

Este ejemplo ejercita estas opciones más complejas.

<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) { 
     //being here means that we were able to create the file..

     //setting this means that we do not need to pass in a password to every file, this will be the default
    $zip->addFile('thing3.txt');

    //$zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_128);
    //$zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_192);
    //you should just use ZipArchive::EM_AES_256 unless you have super-good reason why not. 
    $zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_256, 'password_for_thing3');

     $zip->addFile('thing4.txt');
    //or you can also use the index (starting at 0) of the file...
    //which means the following line should do the same thing...
    //but just referencing the text.txt by index instead of name..
    //$zip->setEncryptionIndex(1, ZipArchive::EM_AES_256, 'password_for_thing_4'); //encrypt thing4, using its index instead of its name...

    $zip->close();
    echo "Added thing3 and thing4 with two different passwordsn";
} else {
    echo "KOn";
}
?>

El soporte subyacente para el cifrado zip está habilitado porque libzip 1.2.0 introdujo soporte para el cifrado. Por lo tanto, necesitará tener php 7.2 y libzip 7.2 para ejecutar este código … Con suerte, esta nota será cruft en esta respuesta “muy pronto”

Aunque PHP es un lenguaje maduro, no existe un método adecuado (excluyendo la extensión personalizada o algo así) para lograr una tarea tan simple con PHP puro.

Lo que también puede hacer es esperar hasta que PHP 7.2 esté disponible para producción (porque ZipArchive :: setEncryptionName está implementado (gracias a Pierre y Remi)).

Pero, hasta entonces, también puede intentar portar php_zip> = 1.14.0 a PHP <7.2, pero actualmente no hay binarios compilados disponibles, por lo que debe compilarlo usted mismo y probar si es posible (creo que es ).

PD: lo probaría, pero no tengo VS2015 + en mi PC en este momento.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *