GPGME использует passphrase_cb
метод для получения пароля от пользователя для операций, которые требуют доступа к закрытым ключам. Этот обратный вызов может быть перезаписан только для симметричного шифрования, во всех остальных случаях используется пинентри по умолчанию.
Все эти усилия кажутся довольно неудобными, особенно потому, что GPGME — это API, который должен использоваться для программирования приложений на C / C ++ / …. В некоторых случаях может быть проще (для программиста, который хотел бы использовать GPGME), если бы парольную фразу можно было передать непосредственно в функции шифрования / подписи. Я также видел, что другие реализации OpenPGP (точнее NetPGP) используют обратный вызов.
Поэтому мне интересно, есть ли какая-то конкретная причина для безопасности?
GnuPG, начиная с версии 2.1, удалил наиболее важные функции закрытого ключа в gpg-agent
, чтобы уменьшить поверхность атаки на самые интимные секреты — закрытые ключи.
Такой обратный вызов не только предоставит парольную фразу для приложения, которое вы пишете (что, вероятно, означает, что поверхность атаки будет даже больше, чем GnuPG), но также GnuPG узнает о парольной фразе.
Если вам действительно нужно контролировать ввод пароля из вашего приложения, у вас есть несколько вариантов.
Тогда поток информации будет таким: ваше приложение вызывает GnuPG через GPGME, GnuPG запрашивает некоторую операцию с закрытым ключом от gpg-agent
, который снова просит ваше приложение для ключевой фразы. Имейте в виду, что это будет работать, только если вы также начали gpg-agent
с соответствующей конфигурацией pinentry (вам может потребоваться запустить другой экземпляр, отличный от того, который уже запущен в вашей системе).
gpg-preset-passphrase
Наиболее важный вариант использования передачи ключевой фразы напрямую — в демонах без головы, где никто не ждет ввода этой ключевой фразы. GnuPG также приносит небольшую утилиту gpg-preset-passphrase
(на Debian и его производных он устанавливается как /usr/lib/gnupg2/gpg-preset-passphrase
), который также может быть использован для предварительного кэширования ключевой фразы (поэтому он не запрашивается в течение настраиваемого времени).
В GnuPG 2.1 была добавлена еще одна опция: gpg-agent
, вы можете разрешить петлевую петлю с allow-loopback-pinentry
вариант. Дополнительный параметр pinentry-mode
установлен в loopback
в GnuPG / GPGME должен позволять обрабатывать взаимодействие с парольной фразой passphrase_cb
снова.
Но: учтите, что это подвергает парольную фразу не как вашему приложению, так и GnuPG, и может оказаться (возможно, незначительным, но существующим и, возможно, ненужным) риском для безопасности. Кроме того, GnuPG 2.1 еще не получил широкого распространения, что может стать проблемой, если вы не контролируете среду.
Других решений пока нет …