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

经过长时间的斗争,我终于找到了一个可行的解决方案。基本思路是写自己的资源处理器和资源处理器工厂。

  1. 创建实现 IResourceHandler 的 MyResourceHandler。
  2. 如果 ResponseLength 没有值且 Stream 为空(可选),则在 GetResponse 函数中进行解密。
  3. 创建实现 IResourceHandlerFactory 的 MyResourceHandlerFactory。
  4. 在GetResourceHandler函数中进行解密。
  5. 在初始化 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()
};