CefSharp 访问加密 HTML/JS/CSS 文件
CefSharp Accessing Encrypted HTML/JS/CSS Files
我一直在用 WPF 构建一个 Windows 桌面应用程序,它有一个嵌入式浏览器 (CefSharp),可以加载本地 HTML/JS/CSS 文件。这些文件并不随应用程序一起提供。每次程序启动时,它们都会从服务器下载。这些文件保存在用户的应用程序数据文件夹中。
我担心的是,这些文件虽然隐藏在应用程序数据文件夹中,但用户仍然可以找到它们,打开它们并阅读它们的内容。这些文件实际上对程序的功能起着最大的作用,我的客户真的希望没有人能窃取源代码,也就是下载的 HTML/JS/CSS 个文件的内容。
所以我的第一个想法是加密文件,只有在程序访问文件时才解密。问题是,CefSharp 是否以某种方式支持这一点? CefSharp 何时或在哪一步开始访问文件?我可以在 CefSharp 读取文件之前拦截它并解密文件内容吗?否则 CefSharp 将无法读取加密内容,对吗?请注意,即使程序是 运行.
,文件也应始终保持加密状态
我知道的唯一方法是:
- 压缩你的JS文件,然后将其转换为ASCII十六进制代码,然后使用eval(decodeURIComponent("YOUR_ASCII_CODE_HERE"))执行javascript.
- 对于 CSS 个文件,我知道的唯一方法是缩小它们。
即使这两种方法都不提供真正的加密,但如果他们想读取文件,您会给他们一些工作要做。
下面是一个使用同样方法进行JS保护的网站:
http://www.hightools.net/javascript-encrypter.php
经过长时间的斗争,我终于找到了一个可行的解决方案。基本思路是写自己的资源处理器和资源处理器工厂。
- 创建实现 IResourceHandler 的 MyResourceHandler。
- 如果 ResponseLength 没有值且 Stream 为空(可选),则在 GetResponse 函数中进行解密。
- 创建实现 IResourceHandlerFactory 的 MyResourceHandlerFactory。
- 在GetResourceHandler函数中进行解密。
- 在初始化 ChromiumWebBrowser 时使用 MyResourceHandlerFactory。
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()
};
我一直在用 WPF 构建一个 Windows 桌面应用程序,它有一个嵌入式浏览器 (CefSharp),可以加载本地 HTML/JS/CSS 文件。这些文件并不随应用程序一起提供。每次程序启动时,它们都会从服务器下载。这些文件保存在用户的应用程序数据文件夹中。
我担心的是,这些文件虽然隐藏在应用程序数据文件夹中,但用户仍然可以找到它们,打开它们并阅读它们的内容。这些文件实际上对程序的功能起着最大的作用,我的客户真的希望没有人能窃取源代码,也就是下载的 HTML/JS/CSS 个文件的内容。
所以我的第一个想法是加密文件,只有在程序访问文件时才解密。问题是,CefSharp 是否以某种方式支持这一点? CefSharp 何时或在哪一步开始访问文件?我可以在 CefSharp 读取文件之前拦截它并解密文件内容吗?否则 CefSharp 将无法读取加密内容,对吗?请注意,即使程序是 运行.
,文件也应始终保持加密状态我知道的唯一方法是:
- 压缩你的JS文件,然后将其转换为ASCII十六进制代码,然后使用eval(decodeURIComponent("YOUR_ASCII_CODE_HERE"))执行javascript.
- 对于 CSS 个文件,我知道的唯一方法是缩小它们。
即使这两种方法都不提供真正的加密,但如果他们想读取文件,您会给他们一些工作要做。
下面是一个使用同样方法进行JS保护的网站: http://www.hightools.net/javascript-encrypter.php
经过长时间的斗争,我终于找到了一个可行的解决方案。基本思路是写自己的资源处理器和资源处理器工厂。
- 创建实现 IResourceHandler 的 MyResourceHandler。
- 如果 ResponseLength 没有值且 Stream 为空(可选),则在 GetResponse 函数中进行解密。
- 创建实现 IResourceHandlerFactory 的 MyResourceHandlerFactory。
- 在GetResourceHandler函数中进行解密。
- 在初始化 ChromiumWebBrowser 时使用 MyResourceHandlerFactory。
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()
};