关于Crypt::OpenSSL::RSA->验证方法的问题

Question about Crypt::OpenSSL::RSA->verify method

我的问题是: https://metacpan.org/pod/Crypt::OpenSSL::RSA

如果描述的方法 verify() 失败,我会这样处理错误:

my $rsa_pub = Crypt::OpenSSL::RSA->new_public_key($x509PubKey);
logm("exception: my err msg...") unless $rsa_pub->verify($text, $signature);

但是有没有可能得到验证失败的确切原因?

我不确定将“验证失败的确切原因”作为一个问题是否有意义。要验证您指定的签名:

  • 签名算法
  • 填充算法
  • 哈希函数

最终签名只是一个数字,它是通过填充明文输入、散列结果字节并使用私钥执行数学计算计算出来的。

验证签名包括获取明文、填充它、散列它,并使用 public 密钥执行数学计算以生成另一个数字,然后将其与签名中的数字进行比较(使用模算术?)。如果数字相同则签名有效,如果它们不同则不是。

所有这些都是一种迂回的说法,如果验证方法 returns 为假,那么假设您使用的是正确的 public 密钥,其中一个必须是不同的:

  • 明文
  • 签名算法
  • 填充算法
  • 哈希函数

但真的无法知道是哪一个。这就像在说“我试图将两个数字相乘得到 42,但我没有得到 42,哪个数字是错误的?”。

这里有几个用于常见算法组合的签名验证函数(我为Authen::NZRealMe::XMLSig写的):

sub _verify_signature_rsa_sha1 {
    my($self, $plaintext, $bin_sig) = @_;
    my $rsa_pub_key = Crypt::OpenSSL::RSA->new_public_key($self->pub_key_text);
    $rsa_pub_key->use_pkcs1_padding();
    $rsa_pub_key->use_sha1_hash();
    return $rsa_pub_key->verify($plaintext, $bin_sig);
}


sub _verify_signature_rsa_sha256 {
    my($self, $plaintext, $bin_sig) = @_;
    my $rsa_pub_key = Crypt::OpenSSL::RSA->new_public_key($self->pub_key_text);
    $rsa_pub_key->use_pkcs1_oaep_padding();
    $rsa_pub_key->use_sha256_hash();
    return $rsa_pub_key->verify($plaintext, $bin_sig);
}

上述代码的上下文是 XML 文档的签名部分,这增加了需要使用正确的规范化和编码的复杂性,而且签名数据是 Base64 编码的,因此需要解码成字节优先。

关于使用哪种填充和散列算法的信息应该可以从您正在使用的源数据的规范中获得,但如果没有,我想您可以尝试随机组合。