Возможно ли сквозное шифрование в Javascript?

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

Мои вопросы: возможно ли сквозное шифрование только с помощью javascript (клиент и node.js/peer.js)? Если да: правильно ли изучать методы шифрования HMAC (RSA)? Я уже пытался понять, как работают эти библиотеки, но мне пока не повезло:)

lib Я нахожу интересным, но я не понимаю (полностью) и не знаю, как его реализовать (в этом случае):

Я могу попытаться уточнить, если потребуется.

UPDATE: Приложение будет мобильным приложением. Использование веб-технологий является немного доказательством концепции.

Ответ 1

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

Artjom правильно указывает, что для однорангового шифрования вам, скорее всего, потребуется аутентификация обеих сторон. Это не обеспечивается обычным SSL/TLS, вам потребуется аутентификация клиента. Но для аутентификации клиентов и серверов вам необходимо установить доверие. В обычных браузерах это обеспечивается внутренним хранилищем сертификатов. Однако гораздо сложнее доверять клиентам.

Все остальные вещи (например, как RSA не является HMAC) - это детали реализации. Однако вы не должны внедрять что-либо, связанное с безопасностью. Сначала сосредоточьтесь на своем случае использования, сценарии угроз и дизайне протокола.

Ответ 2

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

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

Требуемое чтение:

Ответ 3

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

(1) Пользователи должны быть на 100% уверены, что они общаются с кем, по их мнению, они общаются. Это делается для предотвращения атак типа "человек в середине" (MITM), где человеком в середине может быть любой, включая сам сервер (пример: Apple iMessage имеет эту слабость).

(2) Вы должны быть на 100% уверены, что код на стороне клиента не обманывает. Например, действительно ли это шифрование данных с использованием открытого ключа другого человека или просто отправка его в открытый текст где-то еще, а затем шифрование оттуда. Учитывая, что любой, кто имеет доступ к серверу, может меняться JavaScript в любое время, это огромная проблема.

Обе проблемы кажутся разрешимыми.

Для (1) пользователи могут проверять открытые ключи вне диапазона, как это сделано в PGP/GPG (к сожалению, многие люди пропустите этот шаг, но для истинной сквозной защиты вам это понадобится) или keybase.io.

Для (2) группа из MIT утверждает, что решила это в своем проекте Mylar. См. Раздел 6. Следует отметить, что исследователи обнаружили проблемы безопасности с Mylar, но, насколько мне известно, их решение для целостности кода на стороне клиента не было скомпрометировано.

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