diff --git a/Api/Ewide.Core/Ewide.Core.xml b/Api/Ewide.Core/Ewide.Core.xml index 01ad01d..30f8f5c 100644 --- a/Api/Ewide.Core/Ewide.Core.xml +++ b/Api/Ewide.Core/Ewide.Core.xml @@ -7018,37 +7018,32 @@ - + - 生成公私钥 + XML 文件转成PEM 公钥格式 - - + + + - + - 创建公钥文件 + 格式化 - - - - - - 创建私钥文件 - - - + + + - RSA加密 + RSA加密 公钥 - RSA解密 + RSA解密 私钥 diff --git a/Api/Ewide.Core/Service/Auth/AuthService.cs b/Api/Ewide.Core/Service/Auth/AuthService.cs index f57cbd1..b9b3773 100644 --- a/Api/Ewide.Core/Service/Auth/AuthService.cs +++ b/Api/Ewide.Core/Service/Auth/AuthService.cs @@ -70,7 +70,7 @@ namespace Ewide.Core.Service [AllowAnonymous] public async Task 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=AQAB

7yKLJO9dobe7pNW3ob+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=AQAB

7yKLJO9dobe7pNW3ob+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=AQAB

7yKLJO9dobe7pNW3ob+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"