Подтвердить что ты не робот

Как проверить подлинность расширения Chrome?

Контекст:

  • У вас есть веб-сервер, который должен предоставлять эксклюзивный контент только в том случае, если на вашем клиенте установлен ваш конкретный расширение Chrome.
  • У вас есть две возможности предоставить пакет расширения Chrome:
    • В интернет-магазине Chrome
    • С вашего собственного сервера

Проблема:

  • Существует множество решений, позволяющих узнать, что установлено расширение Chrome:
  • Но, похоже, нет решения проверить подлинность расширения Chrome, которое взаимодействует с вашей веб-страницей.
  • В самом деле, поскольку исходный код расширения Chrome можно просмотреть и скопировать любым, кто хочет, , похоже, нет способа узнать, является ли текущее расширение Chrome взаимодействующим с вашей веб-страницей тем, которое у вас есть опубликовал или клонированную версию (и, возможно, несколько измененную) другим человеком.
  • Кажется, вы только можете узнать, что некоторое расширение Chrome взаимодействует с вашей веб-страницей "ожидаемым образом", но вы не можете проверить его подлинность.

Решение?

  • Одно из решений может заключаться в использовании информации, содержащейся в пакете расширения Chrome, и которая не может быть изменена или скопирована кем-либо еще:
    • Отправка идентификатора расширения Chrome на сервер? Но как?
      • Идентификатор должен быть отправлен вами и вашим кодом JavaScript, и, похоже, нет возможности сделать это с помощью "внутренней" функции Chrome.
      • Итак, если кто-то еще отправит один и тот же идентификатор на ваш сервер (какой-то подмену ID расширений Chrome), ваш сервер будет рассматривать его расширение Chrome как подлинное!
    • Использование закрытого ключа, который использовался при упаковке приложения? Но как?
      • Кажется, что нет никакого способа доступа или использования каким-либо образом этого ключа программно!
  • Еще одно решение, заключающееся в использовании плагинов NPAPI и встраивании методов аутентификации, таких как GPG и т.д. Но это решение нежелательно в основном из-за большой раздел "Предупреждение" в API doc.
  • Есть ли другое решение?

Примечания

Этот вопрос пытается повысить реальную проблему безопасности в API расширения Chrome: как проверить подлинность вашего расширения Chrome, когда вам нужно взаимодействовать с вашими службами. Если есть какие-либо недостающие возможности или любые недоразумения, пожалуйста, не стесняйтесь спрашивать меня в комментариях.

4b9b3361

Ответ 1

Извините, но эта проблема, которую вы поставили, по существу неразрешима из-за одной простой проблемы: Вы не можете доверять клиенту. И поскольку клиент может видеть код, тогда вы не можете решить проблему.

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

Модели интернет-безопасности построены на двух сторонах, которые пытаются общаться без участия третьей стороны, чтобы имитировать, изменять или слушать разговор. Не скрывая исходный код расширения, клиент становится неотличимым от третьего лица (файл среди копий - никак не может определить, какой из них).

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

Некоторые исходные тексты могут быть скрыты с помощью плагинов NPAPI, как вы заявляли, но он поставляется с ценой, как вы уже знаете.


Возвращаясь к текущему состоянию вещей:

Теперь возникает вопрос о том, что подразумевается под взаимодействием.

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

Это позволит вам спросить на странице, установлено ли приложение с помощью

    chrome.app.isInstalled

Это вернет логическое отображение, пока ваше приложение не будет установлено. Команда зарегистрирована здесь

Однако это не решает проблему, так как расширение может быть установлено, но не включено, и есть еще одно расширение, высмеивающее связь с вашим сайтом.

Кроме того, проверка выполняется на стороне клиента, поэтому любая функция, использующая эту проверку, может быть перезаписана, чтобы игнорировать результат этой переменной.

Если, однако, взаимодействие означает создание XMLHttpRequests, вам не повезло. Невозможно выполнить текущие методы из-за видимости исходного кода, как описано выше.

Однако, если он ограничивает юзабилити сайтов авторизованными объектами, я предлагаю использовать обычные средства аутентификации: наличие входа в систему пользователя позволит вам создать сеанс. Этот сеанс будет распространяться на все запросы, сделанные расширением, поэтому вы попадаете в обычный клиентский журнал с такими проблемами доверия, как совместное использование учетной записи и т.д. Этому, конечно же, можно управлять, заставляя пользователя регистрироваться через свою учетную запись Google, что больше всего неохотно для совместного использования и дальнейшего смягчения путем блокировки учетных записей, которые, как представляется, используются неправильно.

Ответ 2

Я бы предложил сделать что-то похожее на то, что использует Git (посмотрите http://git-scm.com/book/en/Git-Internals-Git-Objects, чтобы понять, как Git реализует it), т.е.

Создание значений SHA1 содержимого каждого файла в вашем chrome-extension, а затем повторно создать другое значение SHA1 конкатенированные значения SHA1, полученные ранее.

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

Объясняя это более подробно с помощью некоторого псевдокода:

function get_authentication_key(){

    var files = get_all_files_in_extension,
        concatenated_sha_values = '',
        authentication_key;

    for(file in files){
        concatenated_sha_values += Digest::SHA1.hexdigest(get_file_content(file));
    }

    $.ajax({
  url: 'http://example.com/getauthkey',
  type: 'post'
  async: false,
  success:function(data){
         authentication_key = data;
  }
    })

    //You may return either SHA value of concatenated values or return the concatenated SHA values
    return authentication_key;  
}

// Server side code
get('/getauthkey') do
    // One can apply several type of encryption algos on the string passed, to make it unbreakable
authentication_key = Digest::<encryption>.hexdigest($_GET['string']);
return authentication_key;
end

Этот метод позволяет вам проверить, был ли изменен какой-либо файл, возможно, файл изображения или видеофайл или любой другой файл. Был бы рад узнать, может ли эта вещь сломаться.