我一直在WPF中构建Windows桌面应用程序,它有一个嵌入式浏览器(CefSharp),可以加载本地HTML / JS / CSS文件。这些文件不适合应用程序。每次启动程序时,都会从服务器下载它们。这些文件保存在用户的应用程序数据文件夹中。
我担心的是,这些文件虽然隐藏在应用程序数据文件夹中,但用户仍然可以找到它们,打开它们并阅读它们的内容。这些文件实际上是该程序功能的最大部分,我的客户真的希望没有人可以窃取源代码,这意味着下载的HTML / JS / CSS文件的内容。
所以我的第一个想法是加密文件并仅在程序访问文件时解密它们。问题是,CefSharp是否以某种方式支持这个? CefSharp何时或在哪个步骤开始访问文件?在CefSharp可以读取它们之前,我可以拦截它并解密文件的内容吗?否则CefSharp将无法读取加密内容吗?请注意,即使程序正在运行,文件也应始终保持加密状态。
答案 0 :(得分:1)
经过长期的斗争,我终于找到了一个有效的解决方案。基本思想是编写自己的资源处理程序以及资源处理程序工厂。
MyResourceHandler中的示例GetResponse函数:
public virtual Stream GetResponse(IResponse response, out long responseLength, out string redirectUrl)
{
redirectUrl = null;
responseLength = -1;
response.MimeType = MimeType;
response.StatusCode = StatusCode;
response.StatusText = StatusText;
response.ResponseHeaders = Headers;
if (ResponseLength.HasValue)
{
responseLength = ResponseLength.Value;
}
else
{
//If no ResponseLength provided then attempt to infer the length
var memoryStream = Stream as MemoryStream;
if (memoryStream != null)
{
responseLength = memoryStream.Length;
}
else
{
var absoluteFilePath = new Uri(FilePath).AbsolutePath;
var fileBytes = File.ReadAllBytes(absoluteFilePath);
if (ShouldDecrypt)
{
memoryStream = Decrypt(fileBytes);
}
else
{
memoryStream = new MemoryStream(fileBytes);
}
responseLength = memoryStream.Length;
Stream = memoryStream as Stream;
}
}
return Stream;
}
MyResourceHandlerFactory中的GetResourceHandler函数示例:
public virtual IResourceHandler GetResourceHandler(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request)
{
try
{
var uri = new Uri(request.Url);
var filePath = uri.AbsolutePath;
if (!File.Exists(filePath)) return null;
var mime = GetMimeType(filePath);
var fileBytes = File.ReadAllBytes(filePath);
if (ShouldDecrypt)
{
Stream decryptedStream = Decrypt(fileBytes);
return MyResourceHandler.FromStream(decryptedStream, mime);
}
Stream fileStream = new MemoryStream(fileBytes);
return MyResourceHandler.FromStream(fileStream, mime);
}
finally
{
request.Dispose();
}
}
最后,如果你想知道如何初始化使用MyResourceHandlerFactory的ChromiumWebBrowser:
var browser = new ChromiumWebBrowser
{
ResourceHandlerFactory = new MyResourceHandlerFactory()
};
答案 1 :(得分:0)
我所知道的唯一方法是:
即使这两种方法都不提供真正的加密,但是如果他们想要读取文件,你会给他们一些工作要做。
这是一个使用相同的JS保护方法的网站: http://www.hightools.net/javascript-encrypter.php