【原創(chuàng)】 .NETCORE MVC代碼加密
查詢了相關(guān)資料,有大佬們已經(jīng)解決了動態(tài)編譯的問題,也就是把代碼在運(yùn)行的時候動態(tài)編譯進(jìn)程序集再調(diào)用執(zhí)行,根據(jù)這個原理,我寫了一個小小的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(); } } }
加密后為了測試方便,我直接將加密內(nèi)容寫在了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=="
}
}
整個項(xiàng)目目錄結(jié)果如下圖所示
Compiler.cs類負(fù)責(zé)將代碼動態(tài)編譯,DynamicActionProvider.cs,DynamicChangeTokenProvider.cs 分別提供MVC映射的支持和變更通知,ICompiler是動態(tài)編譯的接口,我們只看到一個Home控制器,現(xiàn)在我們將動態(tài)編譯一個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); //動態(tài)注入運(yùn)行 actionProvider.AddControllers(Code); tokenProvider.NotifyChanges(); } catch (Exception ex) { throw new Exception(ex.Message); } return View(); }
我們將提前加密好的代碼載入進(jìn)來,然后解密成明文,再通過 actionProvider.AddControllers(Code) 動態(tài)編譯進(jìn)程序集,程序集是在內(nèi)存中的,以動態(tài)鏈接庫的形式存在。然后 tokenProvider.NotifyChanges 發(fā)出更新通知,這樣我們就可以在瀏覽器中訪問了。為了說明這一切我截個圖給大家
我們的代碼被成功的解密出來后,動態(tài)編譯進(jìn)內(nèi)存了。然后我們?nèi)g覽器訪問一下試試,https://localhost:7245/crack/Time 成功返回當(dāng)前時間,訪問該地址 https://localhost:7245/crack ,屏幕顯示提示:
Crack me , if you can !
看來我們的代碼已經(jīng)正常運(yùn)行,沒有問題了。當(dāng)然今天的加密算法都是很容易被破解的,下節(jié)課我們來升級一下難度。 OK,下面是本文的源碼,