Почему GPGME/GnuPG использует pinentry для ввода пароля?

GPGME использует метод passphrase_cb для получения пароля от пользователя для операций, требующих доступа к закрытым ключам. Этот обратный вызов может быть перезаписан только для симметричного шифрования, во всех остальных случаях используется PIN-код по умолчанию.

Все эти усилия кажутся довольно неудобными, особенно потому, что GPGME — это API, который должен использоваться для программирования приложений C/C++/.... В некоторых случаях было бы проще (для программиста, который хотел бы использовать GPGME), если бы парольную фразу можно было напрямую передать функциям шифрования/подписи. Я также видел, что другие реализации OpenPGP (точнее, NetPGP) используют обратный вызов.

Поэтому мне интересно, есть ли для этого какая-то конкретная причина безопасности?


person little_planet    schedule 28.01.2016    source источник


Ответы (1)


GnuPG, начиная с версии 2.1, удалил наиболее важные функции закрытого ключа в gpg-agent, чтобы уменьшить поверхность атаки на самые сокровенные секреты — закрытые ключи.

Такой обратный вызов не только раскрывает кодовую фразу приложению, которое вы пишете (что, вероятно, означает еще большую поверхность атаки, чем GnuPG), но и GnuPG узнает парольную фразу.

Если вам действительно нужно контролировать ввод парольной фразы из вашего приложения, у вас есть несколько вариантов.

Внедрение Pinentry

Тогда информационный поток будет таким: ваше приложение вызывает 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 вы можете разрешить петлю pinentry с помощью опции allow-loopback-pinentry. Дополнительный параметр pinentry-mode, установленный на loopback в GnuPG/GPGME, должен позволить вам обрабатывать взаимодействие с парольной фразой, снова используя passphrase_cb.

Но: учтите, что это раскрывает парольную фразу не только для вашего приложения, но и для GnuPG, и может оказаться (возможно, незначительной, но существующей и, возможно, ненужной) угрозой безопасности. Кроме того, GnuPG 2.1 еще не получил широкого распространения, что может стать проблемой, если вы не контролируете среду.

person Jens Erat    schedule 28.01.2016
comment
Как эта петля pinentry будет работать технически? Я вижу, что у GPGME есть gpgme_set_pinentry_mode (в рубиновой версии, но я не нашел его в исходная документация). Также у меня сейчас нет прямого доступа к GnuPG (только через GPGME). Как бы я установил там опцию allow-loopback? - person little_planet; 29.01.2016
comment
allow-loopback является опцией в gpg-agent и не может быть установлена ​​через GPGME. Его также нельзя установить, вызвав GnuPG. Для этого вам нужно отредактировать конфигурацию gpg-agent, чтобы указать агенту разрешить пониженную безопасность парольной фразы. - person Jens Erat; 29.01.2016