CefSharp访问加密的HTML / JS / CSS文件

时间:2016-10-28 02:26:15

标签: javascript html encryption chromium-embedded cefsharp

我一直在WPF中构建Windows桌面应用程序,它有一个嵌入式浏览器(CefSharp),可以加载本地HTML / JS / CSS文件。这些文件不适合应用程序。每次启动程序时,都会从服务器下载它们。这些文件保存在用户的应用程序数据文件夹中。

我担心的是,这些文件虽然隐藏在应用程序数据文件夹中,但用户仍然可以找到它们,打开它们并阅读它们的内容。这些文件实际上是该程序功能的最大部分,我的客户真的希望没有人可以窃取源代码,这意味着下载的HTML / JS / CSS文件的内容。

所以我的第一个想法是加密文件并仅在程序访问文件时解密它们。问题是,CefSharp是否以某种方式支持这个? CefSharp何时或在哪个步骤开始访问文件?在CefSharp可以读取它们之前,我可以拦截它并解密文件的内容吗?否则CefSharp将无法读取加密内容吗?请注意,即使程序正在运行,文件也应始终保持加密状态。

2 个答案:

答案 0 :(得分:1)

经过长期的斗争,我终于找到了一个有效的解决方案。基本思想是编写自己的资源处理程序以及资源处理程序工厂。

  1. 创建实现IResourceHandler的MyResourceHandler。
  2. 如果ResponseLength没有值且Stream为null(可选),则在GetResponse函数中进行解密。
  3. 创建实现IResourceHandlerFactory的MyResourceHandlerFactory。
  4. 在GetResourceHandler函数中进行解密。
  5. 初始化ChromiumWebBrowser时使用MyResourceHandlerFactory。
  6. 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文件,然后将其转换为ASCII十六进制代码,然后使用eval(decodeURIComponent(“YOUR_ASCII_CODE_HERE”))来执行javascript。
  • 对于CSS文件,我所知道的唯一方法就是缩小它们。

即使这两种方法都不提供真正的加密,但是如果他们想要读取文件,你会给他们一些工作要做。

这是一个使用相同的JS保护方法的网站: http://www.hightools.net/javascript-encrypter.php