PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Remi Collet : ZipArchive avec cryptage

mercredi 1 mars 2017 à 10:17

Un petit point d'avancement du développement de l'extension zip version 1.14.0 qui intègre désormais le support des archives cryptées.

L'implémentation de cette nouvelle fonctionnalité repose sur l'utilisation de la bibliothèque libzip version 1.2.0 récemment publiée.

Actuellement seule la compilation avec la bibliothèque système offre ce support, mais une mise à jour de la version embarquée est prévue.

Lorsque tout sera validé, la version sera publiée et intégrée aux sources de php (ext/zip), sans doute pour PHP 7.2.

il s'agit d'un développement en cours, rien n'est définitif, et les méthodes proposées peuvent encore changer.

Installation en RPM

Le paquet php-pecl-zip-1.4.0.0-0.2.20170301dev est disponible dans le dépôt remi-test (et remi-php70-test, remi-php71-test).

Installation depuis les sources

Depuis un clone des sources disponibles dans github :

$ phpize
$ ./configure --with-libzip
...
checking for libzip... from pkgconfig: version 1.2.0 found in /usr/lib64
checking for zip_open in -lzip... yes
checking for zip_file_set_encryption in -lzip... yes
...
$ make
...
Build complete.
Don't forget to run 'make test'.
$ make test
...
PASS ZipArchive::setEncryption*() functions [tests/oo_encryption.phpt]

Création d'un archive cryptée

Trois méthodes permettent de gérer le cryptage

ZipArchive::setEncryptionName($name, $method [, $password]);
ZipArchive::setEncryptionIndex($index, $method [, $password]);
ZipArchive::setPassword($password);

La méthode de cryptage devant être une des constantes ZipArchive::EM_NONE, ZipArchive::EM_AES_128, ZipArchive::EM_AES_192 ou , ZipArchive::EM_AES_256.

Exemple :

$zip = new ZipArchive;
$zip->open(__DIR__ . '/encrypted.zip',   ZIPARCHIVE::CREATE | ZipArchive::OVERWRITE);
$zip->addFile(__FILE__, 'foo.php');
$zip->setEncryptionName('foo.php', ZipArchive::EM_AES_256, 'secret');
$zip->close();

Lecture d'une archive cryptée

Exemple :

$zip = new ZipArchive;
$zip->open(__DIR__ . '/encrypted.zip');
print_r($zip->statName($file));
$zip->setPassword('secret');
$text = $zip->getFromName('foo.php');
$zip->close();

A noter :

Lecture d'un archive cryptée via les flux

Il est nécessaire de passer le mot de passe en utilisant un context.

Exemple :

$ctx = stream_context_create(array(
    'zip' => array(
        'password' => 'secret'
    )
));
$text = file_get_contents('zip://' . __DIR__ . '/encrypted.zip#foo.php', false, $ctx);

Conclusion

Le script utilisé dans les exemples ci-dessus est disponible dans les sources de l'extension : encryption.php

Cette nouvelle fonctionnalité me semble intéressante, et permet une meilleure compatibilité avec les outils existants, comme WinZip sous Windows ou 7za sous Linux.

Pour Fedora, cette évolution devrait être disponible dans Fedora 26 qui dispose déjà de libzip 1.2.0.

Gravatar de Remi Collet
Original post of Remi Collet.Votez pour ce billet sur Planet Libre.

Articles similaires