Для PHP есть PECL расширение gnupg.so, которое служит для шифрования данных с помощью предварительно созданных пользователем GPG ключей.
С установкой данного расширения в операционных системах Linux/BSD не возникает особых сложностей, однако для установки расширения "PECL :: Package :: gnupg" в операционных системах Windows нужно будет малость "попотеть", т.е. скомпилировать его самостоятельно.
В данной статье речь пойдёт именно про PECL gnupg под ОС Linux/BSD, установка которого сводится к нескольким несложным командам:
yum -y install gnupg gpg gpgme gpgme-devel libgpg-error-devel pecl install gnupg vi php.ini extension=gnupg.so apachectl graceful
Всё для работы с GnuPG в PHP у нас имеется и нам уже доступны PHP: GnuPG Функции - Manual.
Теперь нам нужно создать пару gpg ключей. При удалённом создании пары gpg ключей в ОС Linux/BSD через SSH консоль могут возникнуть сложности с энтропией и процесс создания ключей зависнет на завершающем этапе:
gpg --gen-key Real name: example.com Email address: [email protected] Comment: GPG key for PHP gpg-cryptor Pass: yuor_password We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. ...
Для успешного завершения нам потребуется установить "yum -y install rng-tools" и в отдельном окне, незакрывая окно в котором запущена команда "gpg --gen-key" выполнить "rngd -f -r /dev/urandom".
Ещё важно знать, что создавать ключи нужно именно из-под того пользователя, для которого они создаются, - т.е. команда "su" не прокатит!
Следующее, что следует помнить при работе с GnuPG через PHP, так это то, что функция "gnupg_decrypt(resource $identifier , string $text);" вернёт "FALSE" если для ключа в функции "gnupg_adddecryptkey( resource $identifier , string $fingerprint , string $passphrase)" третьим параметром был указан пароль ($passphrase), а вернее если на наш gpg ключ был указан пароль, - дело в том, что в GnuPG версии 2 больше нет возможности передавать пароль обычным текстом:
http://www.php.net/manual/ru/function.gnupg-decrypt.php
As of gnupg version 2, it is not possible to pass a plain password any more. The parameter is simply ignored. Instead, a pinentry application will be launched in case of php running in cli mode. In cgi or apache mode, opening the key will fail.
The simplest solution is to use keys without passwords.
Поэтому единственным выходом будет использование gpg ключей с пустыми паролями, а доступ к ним защищать иными способами, например с помощью того же PHP хэшируя пароли в MD5 или SHA1.
Отметим также, что PHP gnupg функции работают с базой ключей того пользователя, от которого работает PHP.
Пример работы PHP gnupg можно глянуть на нашем сайте по этой ссылке /gpg/.

