如何解决关于 Crypt::OpenSSL::RSA->verify 方法的问题
我的问题是: 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);
但是否有可能得到验证失败的确切原因?
解决方法
我不确定将“验证失败的确切原因”作为一个问题是否有意义。要验证您指定的签名:
- 签名算法
- 填充算法
- 哈希函数
最终,签名只是一个数字,它是通过填充明文输入、散列结果字节并使用私钥执行数学计算而计算出来的。
验证签名包括获取明文、填充、散列并使用公钥执行数学计算以生成另一个数字,然后将其与签名中的数字进行比较(使用模算术?)。如果数字相同,则签名有效,如果不同,则无效。
所有这些都是一种迂回的说法,如果 verify 方法返回 false 则假设您使用的是正确的公钥,其中之一必须有所不同:
- 明文
- 签名算法
- 填充算法
- 哈希函数
但是真的没有办法知道是哪一个。这就像在说“我试图将两个数字相乘得到 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,$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 编码的,因此需要先解码为字节。
关于使用哪些填充和散列算法的信息应该可以从您正在使用的源数据的规范中获得,但如果没有,我想您可以尝试随机组合。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。