【原创】 .NETCORE MVC代码加密
查询了相关资料,有大佬们已经解决了动态编译的问题,也就是把代码在运行的时候动态编译进程序集再调用执行,根据这个原理,我写了一个小小的demo,首先将一段待保护的代码进行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(); } } }
加密后为了测试方便,我直接将加密内容写在了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=="
}
}
整个项目目录结果如下图所示
Compiler.cs类负责将代码动态编译,DynamicActionProvider.cs,DynamicChangeTokenProvider.cs 分别提供MVC映射的支持和变更通知,ICompiler是动态编译的接口,我们只看到一个Home控制器,现在我们将动态编译一个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); //动态注入运行 actionProvider.AddControllers(Code); tokenProvider.NotifyChanges(); } catch (Exception ex) { throw new Exception(ex.Message); } return View(); }
我们将提前加密好的代码载入进来,然后解密成明文,再通过 actionProvider.AddControllers(Code) 动态编译进程序集,程序集是在内存中的,以动态链接库的形式存在。然后 tokenProvider.NotifyChanges 发出更新通知,这样我们就可以在浏览器中访问了。为了说明这一切我截个图给大家
我们的代码被成功的解密出来后,动态编译进内存了。然后我们去浏览器访问一下试试,https://localhost:7245/crack/Time 成功返回当前时间,访问该地址 https://localhost:7245/crack ,屏幕显示提示:
Crack me , if you can !
看来我们的代码已经正常运行,没有问题了。当然今天的加密算法都是很容易被破解的,下节课我们来升级一下难度。 OK,下面是本文的源码,