Я знаю, как использовать gpg, например:
$ gpg --verify somefile.sig
gpg: Signature made Tue 23 Jul 2013 13:20:02 BST using RSA key ID E1B768A0
gpg: Good signature from "Richard W.M. Jones <[email protected]>"
gpg: aka "Richard W.M. Jones <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: F777 4FB1 AD07 4A7E 8C87 67EA 9173 8F73 E1B7 68A0
Но то, что я действительно хочу сделать, - это проверить файл на конкретный файл открытого ключа.
Мотивация - это часть программы, которая загружает большие файлы с веб-сайта и должна убедиться, что они не были подделаны до того, как они их используют. На веб-сайте будут содержаться файлы и подписи. Программа будет поставляться с открытым ключом GPG. Когда я загружаю файлы на сайт, я буду подписывать их с соответствующим закрытым ключом (явно не распределенным). Похоже, что программа должна иметь возможность сделать что-то вроде:
gpg --no-default-keyring --verify file.sig \
--is-signed-with /usr/share/program/goodkey.asc
Но gpg
не имеет такого варианта. Похоже, что единственный способ сделать это - разобрать распечатанный вывод команды gpg
, который кажется очень опасным (он содержит текст, контролируемый злоумышленником).
Изменить: я не знаю, что здесь такое этикет для ответа на собственные вопросы, но ответ, который я нашел, это использовать флаг -status-fd. Этот флаг генерирует хорошо разборный вывод, который я могу проверить на желаемый отпечаток:
gpg --status-fd <N> --verify file.sig
производит на fd N:
[GNUPG:] SIG_ID rpG8ATxU8yZr9SHL+VC/WQbV9ac 2013-07-23 1374582002
[GNUPG:] GOODSIG 91738F73E1B768A0 Richard W.M. Jones <[email protected]>
[GNUPG:] VALIDSIG F7774FB1AD074A7E8C8767EA91738F73E1B768A0 2013-07-23 1374582002 0 4 0 1 2 00 F7774FB1AD074A7E8C8767EA91738F73E1B768A0
[GNUPG:] TRUST_UNDEFINED
Вот как работает, например, библиотека Perl GnuPG.