[英]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);
但是是否有可能得到驗證失敗的確切原因?
我不確定將“驗證失敗的確切原因”作為一個問題是否有意義。 要驗證您指定的簽名:
最終,簽名只是一個數字,它是通過填充明文輸入、散列結果字節並使用私鑰執行數學計算而計算出來的。
驗證簽名涉及獲取明文、填充、散列並使用公鑰執行數學計算以生成另一個數字,然后將其與簽名中的數字進行比較(使用模算術?)。 如果數字相同,則簽名有效,如果它們不同,則無效。
所有這些都是一種迂回的說法,如果 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, $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 編碼的,因此需要先解碼為字節。
有關使用哪些填充和散列算法的信息應該可以從您正在使用的源數據的規范中獲得,但如果不是,我想您可以嘗試隨機組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.