2016-10-28 9 views
-2

Я создаю настольное приложение Windows в WPF и имеет встроенный браузер (CefSharp), который загружает локальные файлы HTML/JS/CSS. Эти файлы не приходят с приложением. Они будут загружаться с сервера при каждом запуске программы. Эти файлы хранятся в папке данных приложения пользователя.CefSharp Доступ к зашифрованным файлам HTML/JS/CSS

Я обеспокоен тем, что эти файлы, хотя они скрыты в папке данных приложения, могут все еще находить их, открывать их и читать их содержимое. Эти файлы на самом деле играют большую роль в функциях программы, и мой клиент действительно надеется, что никто не сможет украсть исходные коды, что означает содержание загруженных файлов HTML/JS/CSS.

Итак, моя первая мысль - зашифровать файлы и расшифровать их только тогда, когда программа обращается к файлам. Вопрос в том, поддерживает ли CefSharp это как-то? Когда или на каком этапе CefSharp начинает получать доступ к файлам? Могу ли я перехватить его и расшифровать содержимое файлов до того, как CefSharp сможет их прочитать? В противном случае CefSharp не сможет прочитать право зашифрованного контента? Обратите внимание, что файлы должны оставаться зашифрованными все время, даже когда программа запущена.

+0

Если вы отправляете зашифрованные данные на клиентскую машину, и на этом клиентском компьютере есть программное обеспечение, которое может дешифровать данные, то для всех интенсивных целей вы должны предположить, что клиентская машина имеет доступ к открытому тексту, что, в свою очередь, означает что пользователь имеет доступ к открытому тексту. Нет ничего, что вы можете сделать, что на 100% эффективно. –

ответ

1

После долгой борьбы, я, наконец, нашел рабочий раствор сам. Основная идея - написать мой собственный обработчик ресурсов, а также фабрику обработчиков ресурсов.

  1. Создать MyResourceHandler, который реализует IResourceHandler.
  2. Дешифрование в функции GetResponse, если ResponseLength не имеет значения, а Stream - null (необязательно).
  3. Создайте MyResourceHandlerFactory, который реализует IResourceHandlerFactory.
  4. Дешифрование в функции GetResourceHandler.
  5. Использование MyResourceHandlerFactory при инициализации ChromiumWebBrowser.

функция Sample GetResponse в MyResourceHandler:

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; 
} 

Пример функции GetResourceHandler в MyResourceHandlerFactory:

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(); 
    } 
} 

И, наконец, в случае, если вы хотите знать, как инициализировать ChromiumWebBrowser, который использует MyResourceHandlerFactory:

var browser = new ChromiumWebBrowser 
{ 
    ResourceHandlerFactory = new MyResourceHandlerFactory() 
}; 
0

Единственные методы, которые я знаю, являются:

  • Минимизировать ваши файлы JS, а затем преобразовать его в ASCII шестнадцатеричный код, а затем использовать Eval (decodeURIComponent («YOUR_ASCII_CODE_HERE»)) для выполнения JavaScript.
  • Для файлов CSS единственным способом, который я знаю, является их минимизация.

Даже оба метода не предлагают реального шифрования, но вы дадите им некоторую работу, если они захотят прочитать файлы.

Вот сайт-сайт, который использует тот же метод для защиты JS: http://www.hightools.net/javascript-encrypter.php

+0

Спасибо за ваш ответ. На самом деле я знаю об этих методах. Поэтому я думал, что все равно попытаюсь зашифровать их по-настоящему. Проблема в том, как их расшифровать на лету, когда CefSharp их читает? Было бы здорово, если бы вы могли поделиться своим мнением об этом. –