Можно ли передать как сообщение, так и открытый ключ из стандартного ввода в gpg/gpg2?
Если у меня есть и сообщение (M), и открытый ключ (P) в памяти процесса, каким будет способ шифрования M с использованием P без записи во временный промежуточный файл?
Есть ли шанс, что я могу передать оба в stdin и использовать некоторые хитрые протоколы поддержки gpg(2), чтобы принять оба из канала?
Если нет - каковы другие альтернативы для php (помните, что нативная привязка отсутствует и использование сторонних расширений невозможно (это не входит в стандартный репозиторий Ubuntu, а поддержка нестандартной сборки и нестандартного репозитория слишком дороги))?
2 ответа
По большей части, это мой ответ на аналогичный вопрос, опубликованный на сервере Fault. Реплицированные как межсайтовые дубликаты невозможны.
GnuPG требует, чтобы все ключи, которые вы хотите использовать, были импортированы в связку ключей.
Если вы не хотите импортировать его в вашу обычную связку ключей, используйте другую (временную) связку ключей или даже временный домашний каталог GnuPG (который также будет обходить любую конфигурацию). Если вы не хотите хранить ключ на жестком диске, подумайте об использовании memdisk.
Временный брелок
Задавать --primary-keyring temporary.gpg
использовать (и создавать при необходимости) временную связку ключей по умолчанию. Он будет создан в вашем домашнем каталоге GnuPG (~/.gnupg/temporary.gpg
по умолчанию). Ваш обычный брелок будет по-прежнему доступен, но импорт перейдет на временный. Удалите его как хотите.
Например:
gpg --primary-keyring temporary.gpg --import key.asc
gpg --primary-keyring temporary.gpg --recipient 0xDEADBEEF --encrypt
rm ~/.gnupg/temporary.gpg # can be omitted, not loaded by default
Временный каталог GnuPG
Это также сбросит все настройки и может быть полезно для тестирования некоторых вещей. Задавать --homedir [folder]
или переменная среды $GNUPGHOME
, импортируйте ключ, выполните любые операции и затем удалите папку, как вы хотите.
Например:
export GNUPGHOME=/tmp/gnupg # Or apply --homedir on each invocation
gpg --import key.asc
gpg --recipient 0xDEADBEEF --encrypt
rm -r $GNUPGHOME # Can be omitted
unset $GNUPGHOME
GnuPG очень требователен к разрешениям, вам может потребоваться применить более строгие разрешения к $GNUPGHOME
папку, прежде чем можно будет выполнить все операции. Может быть, это хорошая возможность сохранить игровую площадку $GNUPGHOME
вокруг.
GnuPG для PHP в Ubuntu
Существует официальный модуль PHP PEAR для GnuPG, который также упакован для Ubuntu в официальных репозиториях, и я настоятельно рекомендую использовать этот модуль вместо того, чтобы вручную создавать интерфейс для GnuPG.
Я не верю, что такой механизм существует. GnuPG ожидает, что для выполнения операции pubkey будет использовано кольцо ключей в файле - я не верю, что оно способно принимать фактические открытые ключи для одноразовой операции шифрования без их нахождения в связке ключей.
Сначала вам нужно будет импортировать этот открытый ключ в набор ключей, а затем передать это расположение ключей в GnuPG - другими словами, вы должны быть в состоянии записать его куда-нибудь. Если вы не хотите помещать их на диск, вы можете использовать /dev/shm
, который является виртуальным диском, присутствующим в большинстве систем Linux.