Sfoglia il codice sorgente

[Alipay][Security] 新增 charset 参数

Roc 5 anni fa
parent
commit
533f0df14c

+ 8 - 8
src/Essensoft.AspNetCore.Payment.Alipay/AlipayClient.cs

@@ -90,7 +90,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
             // 添加签名参数
             var signContent = AlipaySignature.GetSignContent(txtParams);
-            txtParams.Add(AlipayConstants.SIGN, AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.SignType));
+            txtParams.Add(AlipayConstants.SIGN, AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.Charset, options.SignType));
 
             string body;
 
@@ -234,7 +234,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
             // 添加签名参数
             var signContent = AlipaySignature.GetSignContent(txtParams);
-            txtParams.Add(AlipayConstants.SIGN, AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.SignType));
+            txtParams.Add(AlipayConstants.SIGN, AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.Charset, options.SignType));
 
             string body;
             var client = _httpClientFactory.CreateClient(nameof(AlipayClient));
@@ -270,13 +270,13 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
             if (!isError || isError && !string.IsNullOrEmpty(signItem.Sign))
             {
-                var rsaCheckContent = AlipaySignature.RSACheckContent(signItem.SignSourceDate, signItem.Sign, options.AlipayPublicKey, options.SignType);
+                var rsaCheckContent = AlipaySignature.RSACheckContent(signItem.SignSourceDate, signItem.Sign, options.AlipayPublicKey, options.Charset, options.SignType);
                 if (!rsaCheckContent)
                 {
                     if (!string.IsNullOrEmpty(signItem.SignSourceDate) && signItem.SignSourceDate.Contains("\\/"))
                     {
                         var srouceData = signItem.SignSourceDate.Replace("\\/", "/");
-                        var jsonCheck = AlipaySignature.RSACheckContent(srouceData, signItem.Sign, options.AlipayPublicKey, options.SignType);
+                        var jsonCheck = AlipaySignature.RSACheckContent(srouceData, signItem.Sign, options.AlipayPublicKey, options.Charset, options.SignType);
                         if (!jsonCheck)
                         {
                             throw new AlipayException("sign check fail: check Sign and Data Fail JSON also");
@@ -404,7 +404,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
             // 添加签名参数
             var signContent = AlipaySignature.GetSignContent(txtParams);
-            txtParams.Add(AlipayConstants.SIGN, AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.SignType));
+            txtParams.Add(AlipayConstants.SIGN, AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.Charset, options.SignType));
 
             string body;
             var client = _httpClientFactory.CreateClient(nameof(AlipayClient));
@@ -446,13 +446,13 @@ namespace Essensoft.AspNetCore.Payment.Alipay
             if (!isError || isError && !string.IsNullOrEmpty(certItem.Sign))
             {
                 var currentAlipayPublicKey = await LoadAlipayPublicKeyAsync(certItem, options);
-                var rsaCheckContent = AlipaySignature.RSACheckContent(certItem.SignSourceDate, certItem.Sign, currentAlipayPublicKey, options.SignType);
+                var rsaCheckContent = AlipaySignature.RSACheckContent(certItem.SignSourceDate, certItem.Sign, currentAlipayPublicKey, options.Charset, options.SignType);
                 if (!rsaCheckContent)
                 {
                     if (!string.IsNullOrEmpty(certItem.SignSourceDate) && certItem.SignSourceDate.Contains("\\/"))
                     {
                         var srouceData = certItem.SignSourceDate.Replace("\\/", "/");
-                        var jsonCheck = AlipaySignature.RSACheckContent(srouceData, certItem.Sign, currentAlipayPublicKey, options.SignType);
+                        var jsonCheck = AlipaySignature.RSACheckContent(srouceData, certItem.Sign, currentAlipayPublicKey, options.Charset, options.SignType);
                         if (!jsonCheck)
                         {
                             throw new AlipayException("sign check fail: check Sign and Data Fail JSON also");
@@ -635,7 +635,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
             // 参数签名
             var signContent = AlipaySignature.GetSignContent(sortedDic);
-            var signResult = AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.SignType);
+            var signResult = AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.Charset, options.SignType);
 
             // 添加签名结果参数
             sortedDic.Add(AlipayConstants.SIGN, signResult);

+ 1 - 1
src/Essensoft.AspNetCore.Payment.Alipay/AlipayNotifyClient.cs

@@ -110,7 +110,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
             }
 
             var prestr = GetSignContent(dictionary);
-            if (!AlipaySignature.RSACheckContent(prestr, sign, useCert ? options.AlipayPublicCertKey : options.AlipayPublicKey, options.SignType))
+            if (!AlipaySignature.RSACheckContent(prestr, sign, useCert ? options.AlipayPublicCertKey : options.AlipayPublicKey, options.Charset, options.SignType))
             {
                 throw new AlipayException("sign check fail: check Sign Data Fail!");
             }

+ 8 - 8
src/Essensoft.AspNetCore.Payment.Alipay/Utility/AlipaySignature.cs

@@ -29,29 +29,29 @@ namespace Essensoft.AspNetCore.Payment.Alipay.Utility
             return sb.Remove(sb.Length - 1, 1).ToString();
         }
 
-        public static string RSASignContent(string data, string privateKey, string signType)
+        public static string RSASignContent(string data, string privateKey, string charset, string signType)
         {
             switch (signType)
             {
                 case "RSA1":
-                    return SHA1WithRSA.Sign(data, privateKey);
+                    return SHA1WithRSA.Sign(data, privateKey, charset);
                 case "RSA2":
-                    return SHA256WithRSA.Sign(data, privateKey);
+                    return SHA256WithRSA.Sign(data, privateKey, charset);
                 default:
-                    return SHA1WithRSA.Sign(data, privateKey);
+                    return SHA1WithRSA.Sign(data, privateKey, charset);
             }
         }
 
-        public static bool RSACheckContent(string data, string sign, string publicKey, string signType)
+        public static bool RSACheckContent(string data, string sign, string publicKey, string charset, string signType)
         {
             switch (signType)
             {
                 case "RSA1":
-                    return SHA1WithRSA.Verify(data, sign, publicKey);
+                    return SHA1WithRSA.Verify(data, sign, publicKey, charset);
                 case "RSA2":
-                    return SHA256WithRSA.Verify(data, sign, publicKey);
+                    return SHA256WithRSA.Verify(data, sign, publicKey, charset);
                 default:
-                    return SHA1WithRSA.Verify(data, sign, publicKey);
+                    return SHA1WithRSA.Verify(data, sign, publicKey, charset);
             }
         }
 

+ 14 - 4
src/Essensoft.AspNetCore.Payment.Security/SHA1WithRSA.cs

@@ -6,7 +6,7 @@ namespace Essensoft.AspNetCore.Payment.Security
 {
     public static class SHA1WithRSA
     {
-        public static string Sign(string data, string privateKey)
+        public static string Sign(string data, string privateKey, string charset)
         {
             if (string.IsNullOrEmpty(data))
             {
@@ -18,14 +18,19 @@ namespace Essensoft.AspNetCore.Payment.Security
                 throw new ArgumentNullException(nameof(privateKey));
             }
 
+            if (string.IsNullOrEmpty(charset))
+            {
+                throw new ArgumentNullException(nameof(charset));
+            }
+
             using (var rsa = RSA.Create())
             {
                 rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out var _);
-                return Convert.ToBase64String(rsa.SignData(Encoding.UTF8.GetBytes(data), HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1));
+                return Convert.ToBase64String(rsa.SignData(Encoding.GetEncoding(charset).GetBytes(data), HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1));
             }
         }
 
-        public static bool Verify(string data, string sign, string publicKey)
+        public static bool Verify(string data, string sign, string publicKey, string charset)
         {
             if (string.IsNullOrEmpty(data))
             {
@@ -42,10 +47,15 @@ namespace Essensoft.AspNetCore.Payment.Security
                 throw new ArgumentNullException(nameof(publicKey));
             }
 
+            if (string.IsNullOrEmpty(charset))
+            {
+                throw new ArgumentNullException(nameof(charset));
+            }
+
             using (var rsa = RSA.Create())
             {
                 rsa.ImportSubjectPublicKeyInfo(Convert.FromBase64String(publicKey), out var _);
-                return rsa.VerifyData(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(sign), HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
+                return rsa.VerifyData(Encoding.GetEncoding(charset).GetBytes(data), Convert.FromBase64String(sign), HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
             }
         }
     }

+ 14 - 4
src/Essensoft.AspNetCore.Payment.Security/SHA256WithRSA.cs

@@ -6,7 +6,7 @@ namespace Essensoft.AspNetCore.Payment.Security
 {
     public static class SHA256WithRSA
     {
-        public static string Sign(string data, string privateKey)
+        public static string Sign(string data, string privateKey, string charset)
         {
             if (string.IsNullOrEmpty(data))
             {
@@ -18,14 +18,19 @@ namespace Essensoft.AspNetCore.Payment.Security
                 throw new ArgumentNullException(nameof(privateKey));
             }
 
+            if (string.IsNullOrEmpty(charset))
+            {
+                throw new ArgumentNullException(nameof(charset));
+            }
+
             using (var rsa = RSA.Create())
             {
                 rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out var _);
-                return Convert.ToBase64String(rsa.SignData(Encoding.UTF8.GetBytes(data), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
+                return Convert.ToBase64String(rsa.SignData(Encoding.GetEncoding(charset).GetBytes(data), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
             }
         }
 
-        public static bool Verify(string data, string sign, string publicKey)
+        public static bool Verify(string data, string sign, string publicKey, string charset)
         {
             if (string.IsNullOrEmpty(data))
             {
@@ -42,10 +47,15 @@ namespace Essensoft.AspNetCore.Payment.Security
                 throw new ArgumentNullException(nameof(publicKey));
             }
 
+            if (string.IsNullOrEmpty(charset))
+            {
+                throw new ArgumentNullException(nameof(charset));
+            }
+
             using (var rsa = RSA.Create())
             {
                 rsa.ImportSubjectPublicKeyInfo(Convert.FromBase64String(publicKey), out var _);
-                return rsa.VerifyData(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(sign), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
+                return rsa.VerifyData(Encoding.GetEncoding(charset).GetBytes(data), Convert.FromBase64String(sign), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
             }
         }
     }