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

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

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

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

2

Решение

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), который также может быть использован для предварительного кэширования ключевой фразы (поэтому он не запрашивается в течение настраиваемого времени).

Pinentry Loopback

В GnuPG 2.1 была добавлена ​​еще одна опция: gpg-agent, вы можете разрешить петлевую петлю с allow-loopback-pinentry вариант. Дополнительный параметр pinentry-mode установлен в loopback в GnuPG / GPGME должен позволять обрабатывать взаимодействие с парольной фразой passphrase_cb снова.

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]