You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
using Senparc.Weixin.Helpers ;
using System ;
using System.Collections.Generic ;
using System.Security.Cryptography ;
using System.Security.Cryptography.X509Certificates ;
using System.Text ;
namespace Senparc.Weixin.TenPayV3.TenPayHttpClient.Verifier
{
public class SHA256WithRSAVerifier : IVerifier
{
public bool Verify ( string wechatpayTimestamp , string wechatpayNonce , string wechatpaySignatureBase64 , string content , string pubKey )
{
//验签名串
string contentForSign = $"{wechatpayTimestamp}\n{wechatpayNonce}\n{content}\n" ;
//Base64 解码 pubKey( 必须已经使用 ApiSecurityHelper.GetUnwrapCertKey() 方法进行 Unwrap)
var bs = Convert . FromBase64String ( pubKey ) ;
//使用 X509Certificate2 证书
var x509 = new X509Certificate2 ( bs ) ;
//AsymmetricAlgorithm对象
var key = x509 . PublicKey . Key ;
//RSAPKCS1SignatureDeformatter 对象
RSAPKCS1SignatureDeformatter df = new RSAPKCS1SignatureDeformatter ( key ) ;
//指定 SHA256
df . SetHashAlgorithm ( "SHA256" ) ;
//SHA256Managed 方法已弃用,使用 SHA256.Create() 生成 SHA256 对象
var sha256 = SHA256 . Create ( ) ;
//应答签名
byte [ ] signature = Convert . FromBase64String ( wechatpaySignatureBase64 ) ;
//对比签名
byte [ ] compareByte = sha256 . ComputeHash ( Encoding . UTF8 . GetBytes ( contentForSign ) ) ;
//验证签名
var result = df . VerifySignature ( compareByte , signature ) ;
return result ;
}
}
}