1个回答

4

PHP的GnuPG文档确实缺乏相关信息。查看源代码和GPGME手册及源代码,您可以得出相关信息。

免责声明:答案包含一些猜测,但如果在此基础上进行构建,您肯定会对正在发生的事情有一个合理的感觉,并且可以随时提供反馈!

有效性

为什么有效性总是0?

要验证签名的有效性,您需要分配信任(以便GnuPG能够计算信任链)。 有效性在以下GPGME枚举中定义

/* The available validities for a trust item or key.  */
typedef enum
  {
    GPGME_VALIDITY_UNKNOWN   = 0,
    GPGME_VALIDITY_UNDEFINED = 1,
    GPGME_VALIDITY_NEVER     = 2,
    GPGME_VALIDITY_MARGINAL  = 3,
    GPGME_VALIDITY_FULL      = 4,
    GPGME_VALIDITY_ULTIMATE  = 5
  }
gpgme_validity_t;

时间戳

时间戳的值是什么?消息签名时的时间?

是的,这是签名创建的时间戳。请注意,时间戳通常由签名者定义,可以伪造为任意日期。

状态

摘要中值为4代表什么?

根据文档 (gpgme_error_t status), 状态在 gpg-error.h 中定义。这是一个非常长的列表,托管在GnuPG的git存储库中

然而,在您的问题中定义的状态对我来说没有意义。

总结

为什么第二个案例中状态值如此之大?这只是随机值还是特定的错误代码?

这是有关签名的摘要。同样,摘要在GPGME枚举中定义

/* Flags used for the SUMMARY field in a gpgme_signature_t.  */
typedef enum
  {
    GPGME_SIGSUM_VALID       = 0x0001,  /* The signature is fully valid.  */
    GPGME_SIGSUM_GREEN       = 0x0002,  /* The signature is good.  */
    GPGME_SIGSUM_RED         = 0x0004,  /* The signature is bad.  */
    GPGME_SIGSUM_KEY_REVOKED = 0x0010,  /* One key has been revoked.  */
    GPGME_SIGSUM_KEY_EXPIRED = 0x0020,  /* One key has expired.  */
    GPGME_SIGSUM_SIG_EXPIRED = 0x0040,  /* The signature has expired.  */
    GPGME_SIGSUM_KEY_MISSING = 0x0080,  /* Can't verify: key missing.  */
    GPGME_SIGSUM_CRL_MISSING = 0x0100,  /* CRL not available.  */
    GPGME_SIGSUM_CRL_TOO_OLD = 0x0200,  /* Available CRL is too old.  */
    GPGME_SIGSUM_BAD_POLICY  = 0x0400,  /* A policy was not met.  */
    GPGME_SIGSUM_SYS_ERROR   = 0x0800   /* A system error occured.  */
  }
gpgme_sigsum_t;

因此,您必须将结果读取为二进制标志。状态为4表示签名错误。
总结
第一个签名是在2015-09-23T18:44:56+00:00由密钥468F82339FC55DE5CAFD71BB63DD32AE1308A57F生成的,是正确的签名,但无法验证密钥(缺少信任路径)。
第二个签名似乎是由相同的密钥发布的,但是已经损坏。
如果我只想简单地识别文本是否正确签名,我可以将返回的指纹与公钥的指纹进行比较,并检查状态和摘要是否等于0吗?
据我所了解,您应该测试summary的第4位是否设置。如果设置了,您就有一个错误的签名。不要将其与4进行比较,而是使用位操作来对单个位进行测试:
($summary & 0x04) == 0x04

如果您不使用信任网络和有效性标志来验证签名,请确保将整个指纹与可信密钥列表进行比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接