LoginAsync([Required] LoginInput input)
{
- var pwd = input.Password; // RSAHandler.RSADecrypt(input.Password);
+ string pwd = RSAHandler.RSADecrypt(input.Password);
// 获取加密后的密码
var encryptPasswod = MD5Encryption.Encrypt(pwd);
diff --git a/Api/Ewide.Core/Util/RSAHandler.cs b/Api/Ewide.Core/Util/RSAHandler.cs
index c443491..155b8af 100644
--- a/Api/Ewide.Core/Util/RSAHandler.cs
+++ b/Api/Ewide.Core/Util/RSAHandler.cs
@@ -1,4 +1,9 @@
-using Furion.FriendlyException;
+using Furion;
+using Furion.FriendlyException;
+using Org.BouncyCastle.Asn1.X509;
+using Org.BouncyCastle.Crypto.Parameters;
+using Org.BouncyCastle.Math;
+using Org.BouncyCastle.X509;
using System;
using System.Collections.Generic;
using System.IO;
@@ -11,59 +16,60 @@ namespace Ewide.Core.Util
{
public static class RSAHandler
{
-
///
- /// 生成公私钥
+ /// XML 文件转成PEM 公钥格式
///
- ///
- ///
- public static void RSAKey(string PrivateKeyPath, string PublicKeyPath)
+ ///
+ ///
+ ///
+ public static string Xml2PemPublic(string xml, string saveFile)
{
- RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
- CreatePrivateKeyXML(PrivateKeyPath, provider.ToXmlString(true));
- CreatePublicKeyXML(PublicKeyPath, provider.ToXmlString(false));
- }
- ///
- /// 创建公钥文件
- ///
- ///
- ///
- public static void CreatePublicKeyXML(string path, string publickey)
- {
- using (FileStream publickeyxml = new FileStream(path, FileMode.Create))
+ var rsa = new RSACryptoServiceProvider();
+ rsa.FromXmlString(xml); var p = rsa.ExportParameters(false);
+ RsaKeyParameters key = new RsaKeyParameters(false, new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent)); using (var sw = new StreamWriter(saveFile))
{
- using (StreamWriter sw = new StreamWriter(publickeyxml))
- {
- sw.WriteLine(publickey);
- }
+ var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw);
+ pemWriter.WriteObject(key);
}
+ SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(key); byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
+ string publicKey = Convert.ToBase64String(serializedPublicBytes);
+ return Format(publicKey, 1);
}
-
///
- /// 创建私钥文件
+ /// 格式化
///
- ///
- ///
- public static void CreatePrivateKeyXML(string path, string privatekey)
+ ///
+ ///
+ ///
+ public static string Format(string key, int type)
{
- using (FileStream privatekeyxml = new FileStream(path, FileMode.Create))
+ string result = string.Empty; int length = key.Length / 64; for (int i = 0; i < length; i++)
{
- using (StreamWriter sw = new StreamWriter(privatekeyxml))
- {
- sw.WriteLine(privatekey);
- }
+ int start = i * 64;
+ result = result + key.Substring(start, 64) + "\r\n";
}
- }
+ result = result + key.Substring(length * 64); if (type == 1)
+ {
+ result = result.Insert(0, "-----BEGIN PUBLIC KEY-----\r\n");
+ result += "\r\n-----END PUBLIC KEY-----";
+ }
+ if (type == 2)
+ {
+ result = result.Insert(0, "-----BEGIN PRIVATE KEY-----\r\n");
+ result += "\r\n-----END PRIVATE KEY-----";
+ }
+ return result;
+ }
///
- /// RSA加密
+ /// RSA加密 公钥
///
///
///
public static string RSAEncrypt(string content)
{
- string publickey = @"tu98wMoo297l+juulU4a3Xx7c2SZ93f0gTPKohE0uz4o8jWN8zXnAAfhf6MMTlkgf+qIwaORLtBQohDcX6Xp02Qe7Cq2LujVR+YJHxy2uo8+KTc5Rj/d0OkTjeCozGaJQH0XrwUO7w+rDnyXzA52IvMZPnUV3KnOj1mPH0IhrOU=AQAB";
-
+ //string publickey = @"tu98wMoo297l+juulU4a3Xx7c2SZ93f0gTPKohE0uz4o8jWN8zXnAAfhf6MMTlkgf+qIwaORLtBQohDcX6Xp02Qe7Cq2LujVR+YJHxy2uo8+KTc5Rj/d0OkTjeCozGaJQH0XrwUO7w+rDnyXzA52IvMZPnUV3KnOj1mPH0IhrOU=AQAB";
+ string publickey = App.Configuration["RSA:publickey"];
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(publickey);
@@ -72,14 +78,14 @@ namespace Ewide.Core.Util
}
///
- /// RSA解密
+ /// RSA解密 私钥
///
///
///
public static string RSADecrypt(string content)
{
- string privatekey = @"tu98wMoo297l+juulU4a3Xx7c2SZ93f0gTPKohE0uz4o8jWN8zXnAAfhf6MMTlkgf+qIwaORLtBQohDcX6Xp02Qe7Cq2LujVR+YJHxy2uo8+KTc5Rj/d0OkTjeCozGaJQH0XrwUO7w+rDnyXzA52IvMZPnUV3KnOj1mPH0IhrOU=AQAB7yKLJO9dobe7pNW3ob+Vse8kvlA+PObDrZNqFxUTLyXoAeHDnwz3BjJ2EVUPNJHV5F1/KPLTvADIjDrdB1qcbw==
w9ZK0SHBddtE91skFFS72YDmxzmXumSuUyREStVul9ke0oU2HjcZA915bmR0Zrh1RzO3y1w9zXVn+GdZGjyd6w==
ncA67E2fhcwv0+hMcD5zYOLyaT2EISbWFQ43ISz879BgwcUOCEFEP+lP69Uh57sAz9pBxWCS/uXBZoh6QJysrw==vbC8F4YS1g3l55Koh+jra+qnnyHyDeGn2XCvlazWys7MRC40FWBZIp1MGdnDxhu1vZoi1SAr3O90HfA9JmTAsQ==00v2vMCcgXy78eMby7R6zfZzacVnVFO2WeyxYF7pjrXYYP+C4JSJkWpy6JGLWbgZrK8HAuRguJmdRi8K2KiYWg==rV3nb9nmwQDMGMrI2GyN30uivygfFj0TdgK8Tb1aqPzu1yRT46M4yXmuhkTiW7nxp+iANGssIx5+3Ch4gRj+r6BgBPldWNErK95a2v2Ae1+EzfVf21ybguBYeUVnV9c8qwoodZSVOajZapOgoS6s5TEOxHWRcF22AiFuaD1Tl90=";
-
+ //string privatekey = @"tu98wMoo297l+juulU4a3Xx7c2SZ93f0gTPKohE0uz4o8jWN8zXnAAfhf6MMTlkgf+qIwaORLtBQohDcX6Xp02Qe7Cq2LujVR+YJHxy2uo8+KTc5Rj/d0OkTjeCozGaJQH0XrwUO7w+rDnyXzA52IvMZPnUV3KnOj1mPH0IhrOU=AQAB7yKLJO9dobe7pNW3ob+Vse8kvlA+PObDrZNqFxUTLyXoAeHDnwz3BjJ2EVUPNJHV5F1/KPLTvADIjDrdB1qcbw==
w9ZK0SHBddtE91skFFS72YDmxzmXumSuUyREStVul9ke0oU2HjcZA915bmR0Zrh1RzO3y1w9zXVn+GdZGjyd6w==
ncA67E2fhcwv0+hMcD5zYOLyaT2EISbWFQ43ISz879BgwcUOCEFEP+lP69Uh57sAz9pBxWCS/uXBZoh6QJysrw==vbC8F4YS1g3l55Koh+jra+qnnyHyDeGn2XCvlazWys7MRC40FWBZIp1MGdnDxhu1vZoi1SAr3O90HfA9JmTAsQ==00v2vMCcgXy78eMby7R6zfZzacVnVFO2WeyxYF7pjrXYYP+C4JSJkWpy6JGLWbgZrK8HAuRguJmdRi8K2KiYWg==rV3nb9nmwQDMGMrI2GyN30uivygfFj0TdgK8Tb1aqPzu1yRT46M4yXmuhkTiW7nxp+iANGssIx5+3Ch4gRj+r6BgBPldWNErK95a2v2Ae1+EzfVf21ybguBYeUVnV9c8qwoodZSVOajZapOgoS6s5TEOxHWRcF22AiFuaD1Tl90=";
+ string privatekey = App.Configuration["RSA:privatekey"];
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
try
@@ -88,7 +94,7 @@ namespace Ewide.Core.Util
cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
return Encoding.UTF8.GetString(cipherbytes);
}
- catch
+ catch
{
throw Oops.Oh(ErrorCode.D1000);
}
diff --git a/Api/Ewide.Core/applicationconfig.json b/Api/Ewide.Core/applicationconfig.json
index 54c8b9b..7b21268 100644
--- a/Api/Ewide.Core/applicationconfig.json
+++ b/Api/Ewide.Core/applicationconfig.json
@@ -27,6 +27,10 @@
"DataBase": "DataBaseXml",
"ReadSelect": "SeedData" // SeedData 和 DataBase 两个中间选
},
+ "RSA": {
+ "publickey": "tu98wMoo297l+juulU4a3Xx7c2SZ93f0gTPKohE0uz4o8jWN8zXnAAfhf6MMTlkgf+qIwaORLtBQohDcX6Xp02Qe7Cq2LujVR+YJHxy2uo8+KTc5Rj/d0OkTjeCozGaJQH0XrwUO7w+rDnyXzA52IvMZPnUV3KnOj1mPH0IhrOU=AQAB",
+ "privatekey": "tu98wMoo297l+juulU4a3Xx7c2SZ93f0gTPKohE0uz4o8jWN8zXnAAfhf6MMTlkgf+qIwaORLtBQohDcX6Xp02Qe7Cq2LujVR+YJHxy2uo8+KTc5Rj/d0OkTjeCozGaJQH0XrwUO7w+rDnyXzA52IvMZPnUV3KnOj1mPH0IhrOU=AQAB7yKLJO9dobe7pNW3ob+Vse8kvlA+PObDrZNqFxUTLyXoAeHDnwz3BjJ2EVUPNJHV5F1/KPLTvADIjDrdB1qcbw==
w9ZK0SHBddtE91skFFS72YDmxzmXumSuUyREStVul9ke0oU2HjcZA915bmR0Zrh1RzO3y1w9zXVn+GdZGjyd6w==
ncA67E2fhcwv0+hMcD5zYOLyaT2EISbWFQ43ISz879BgwcUOCEFEP+lP69Uh57sAz9pBxWCS/uXBZoh6QJysrw==vbC8F4YS1g3l55Koh+jra+qnnyHyDeGn2XCvlazWys7MRC40FWBZIp1MGdnDxhu1vZoi1SAr3O90HfA9JmTAsQ==00v2vMCcgXy78eMby7R6zfZzacVnVFO2WeyxYF7pjrXYYP+C4JSJkWpy6JGLWbgZrK8HAuRguJmdRi8K2KiYWg==rV3nb9nmwQDMGMrI2GyN30uivygfFj0TdgK8Tb1aqPzu1yRT46M4yXmuhkTiW7nxp+iANGssIx5+3Ch4gRj+r6BgBPldWNErK95a2v2Ae1+EzfVf21ybguBYeUVnV9c8qwoodZSVOajZapOgoS6s5TEOxHWRcF22AiFuaD1Tl90="
+ },
"Cache": {
"CacheType": "MemoryCache", // RedisCache
"RedisConnectionString": "127.0.0.1:6379,password=,defaultDatabase=2"