【原創(chuàng)】 .NETCORE MVC代碼加密
查詢了相關(guān)資料,有大佬們已經(jīng)解決了動(dòng)態(tài)編譯的問(wèn)題,也就是把代碼在運(yùn)行的時(shí)候動(dòng)態(tài)編譯進(jìn)程序集再調(diào)用執(zhí)行,根據(jù)這個(gè)原理,我寫(xiě)了一個(gè)小小的demo,首先將一段待保護(hù)的代碼進(jìn)行RSA加密,代碼如下:
using Microsoft.AspNetCore.Mvc; namespace WINS.Controllers { public class CrackController : Controller { public string Index() { return "Crack me , if you can !"; } public string Time() { return System.DateTime.Now.ToString(); } } }
加密后為了測(cè)試方便,我直接將加密內(nèi)容寫(xiě)在了appsettings.json文件中,如下圖所示:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"WebConfig": {
"PriKey": "MIIEvQIBADANBgkqh......nIhttu1h9Zk=",
"Signatrue": "RoJMV/ff7UggrXAkyXuQv5EOd4BaWaCwgMGONeplUbSXfaHDD/c1wH9y69XmL7U3bBUeWaA196I0Bb+DPvi5/dKo8m2FtRqrK1iI7nzWAMbYGRNJE8JPuknjZjbwoxBOsH9L9+g5vWynCnPeOZU7F8Y8S0IMv/FApKZEV2KwYB4=",
"Code": "RkEYCyLAyIknwH......F2g9BQ=="
}
}
整個(gè)項(xiàng)目目錄結(jié)果如下圖所示
Compiler.cs類(lèi)負(fù)責(zé)將代碼動(dòng)態(tài)編譯,DynamicActionProvider.cs,DynamicChangeTokenProvider.cs 分別提供MVC映射的支持和變更通知,ICompiler是動(dòng)態(tài)編譯的接口,我們只看到一個(gè)Home控制器,現(xiàn)在我們將動(dòng)態(tài)編譯一個(gè)Crack控制器。
[HttpGet("/")] public IActionResult Index([FromServices] DynamicActionProvider actionProvider, [FromServices] DynamicChangeTokenProvider tokenProvider) { try { //從appsetting.json加載私鑰,加密的源碼,簽名 string PriKey = WebConfig.PriKey; string SourceCode = WebConfig.Code; string Signatrue = WebConfig.Signatrue; //解密成明文源代碼 RSAService rSAService = new RSAService(); string Code = rSAService.Decrypt(PriKey, rSAService.Base64Encode(SourceCode), true); var cc = Convert.FromBase64String(Code); Code = Encoding.Unicode.GetString(cc); //動(dòng)態(tài)注入運(yùn)行 actionProvider.AddControllers(Code); tokenProvider.NotifyChanges(); } catch (Exception ex) { throw new Exception(ex.Message); } return View(); }
我們將提前加密好的代碼載入進(jìn)來(lái),然后解密成明文,再通過(guò) actionProvider.AddControllers(Code) 動(dòng)態(tài)編譯進(jìn)程序集,程序集是在內(nèi)存中的,以動(dòng)態(tài)鏈接庫(kù)的形式存在。然后 tokenProvider.NotifyChanges 發(fā)出更新通知,這樣我們就可以在瀏覽器中訪問(wèn)了。為了說(shuō)明這一切我截個(gè)圖給大家
我們的代碼被成功的解密出來(lái)后,動(dòng)態(tài)編譯進(jìn)內(nèi)存了。然后我們?nèi)g覽器訪問(wèn)一下試試,https://localhost:7245/crack/Time 成功返回當(dāng)前時(shí)間,訪問(wèn)該地址 https://localhost:7245/crack ,屏幕顯示提示:
Crack me , if you can !
看來(lái)我們的代碼已經(jīng)正常運(yùn)行,沒(méi)有問(wèn)題了。當(dāng)然今天的加密算法都是很容易被破解的,下節(jié)課我們來(lái)升級(jí)一下難度。 OK,下面是本文的源碼,