Шифрованный тоннель для общения через VK (RSA + GreaseMonkey)

    В связи с развитием событий в мире последним временем пользователи сети всё чаще задумываются о своей безопасности: кто-то отказывается пользоваться рядом web-сервисов, кто-то удаляет личную информацию, фото и другие данные с социальных сетей, а кто-то и вовсе «блокирует» свои учётные записи. Но вот только большинство этих данных удаляются лишь визуально, что, в принципе, общеизвестный факт.
    image

    Поскольку значительная часть моих знакомых — это люди, не имеющие достаточных знаний в сфере IT, то приходится изощряться, чтобы заставить их пользоваться непривычными им сервисами либо утилитами, которые я считаю безопасными.
    Предлагаю относительно простой способ установки безопасного канала для текстового общения через всеми известную сеть ВКонтакте. Для этого не нужно никакого дополнительного софта либо обширных знаний в сфере информационной безопасности. Всё, что вам нужно иметь — это web-браузер и аддон GreaseMonkey.

    Общая информация


    Мотив данного метода — создать канал, управляемый собеседниками без посредника, т.е. не давать возможность серверу видеть незашифрованный текст сообщений. Конечно, типичная man-in-the-middle атака посредством подмены открытого ключа вполне возможна, но очень маловероятна, так как мы опасаемся не прослушки в режиме реального времени, а потенциальной опасности компрометации текста сообщений в ближайшем будущем, например, по запросу спецслужб.
    Как я уже говорил выше, была идея создать собственный месенджер (ну вы поняли, с чем). Почему? Из пары причин:
    • Я и мои друзья можем доверять моему продукту;
    • Я могу сделать его таким, как хочу;
    • Это — весело!

    Но через некоторые трудности, среди каких — как разработка продукта, так и его внедрение среди непрограммистов. Поэтому в качестве субъекта сих извращений был однозначно выбран ВКонтакте, а платформой для внедрения конечного продукта стал аддон GreaseMonkey:
    • Большинство знакомых пользуется именно ВКонтакте;
    • Довольно просто объяснить процесс разворачивания моего скрипта.


    Немного общеизвестных технических данных


    Исходя из того, на какую аудиторию рассчитана эта статья, я не буду объяснять процесс установки GreaseMonkey и моего скрипта. Если же вы не знаете, как это сделать — читайте мануал, например, тут (спасибо google за эту ссылку).

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


    Процесс в картинке:
    image

    Для реализации алгоритма RSA я использовал его JS-имплементацию, написанную парнями из Стэнфорда. Она была одной из первых, что попались на глаза, и отлично оправдала все мои ожидания, поэтому я использовал именно её.

    Ближе к делу


    Итак, что делает скрипт?
    • Внедряет себя в страницу ВК при её открытии, и патчит документ, добавляя ивент на нажатие CTRL+SHIFT+V;
    • По нажатию последней комбинации добавляет кнопки отправки зашифрованных сообщений и генерации публичного ключа для напарника;
    • Реагирует на сообщения вида "%n:открытый_ключ_напарника" и "%m:зашифрованное_сообщение", заменяя их нотификациями про факт получения публичного ключа от напарника либо расшифрованным текстом.
    • Патчит элементы DOM своими атрибутами с префиксом «vksl-» для сохранения своего состояния.


    Краткая инструкция


    При открытии страницы с чатом в верхнем правом углу должно появиться сообщение «VKSL loaded» (возможно, придется нажать F5, если вы перешли с другой страницы). Нажав CTRL+SHIFT+V на странице с чатом, опять таки получим сообщение об успешной (или же неудачной) инъекции шифратора в код страницы.
    После этого каждый из собеседников должен нажать на линк «GENERATE KEYS NOW». Через несколько (возможно, десятков) секунд появится сообщение, что ключ сгенерирован и отправлен. Следовательно, собеседник на другом конце будет тоже уведомлен об этом.
    Теперь можно приступать к общению. Для отправки обычного сообщения пользуемся стандартной кнопкой, для отправки шифрованного — нажимаем на «SEND ENCRYPTED». Скрипт на другом конце сам поймёт, что нужно делать, если получено зашифрованное сообщение.

    Проблемы, которые до сих пор было лень устранить (а следовало бы)


    • Скрипт не работает в конференциях, а рассчитан лишь на двустороннее общение.
    • Максимальная длина сообщения на данный момент лишь 32 байта — нужно шифровать, разбивая текст на блоки, а не так, как там сейчас.
    • По нажатию на «Enter» вызывается нативная отправка. Нужно немного больше порыться в коде, чтобы заменить и этот ивент.
    • Аттачменты не шифруются, поскольку они фактически не являются частью сообщения.


    Установить скрипт можно отсюда: http://userscripts.org/scripts/show/396094
    Спасибо за ваше внимание!

    EDIT: Приношу извинения за множество орфографических ошибок, на которые читатели любезно обратили моё внимание. Кажется, всё исправил.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 44

      0
      Если оба собеседника имеют серые IP (т.е. находятся за NAT и не имеют возможности соединения напрямую), то как ваш скрипт автоматизирует процесс обмена ключами?
        +1
        Спасибо за комментарий. Тут все данные идут через меседжинг контакта, то есть не имеет значения, из какой сети пользователь.
        +6
        1. Вы передаете публичные ключи открытым текстом? То есть теоретически кто-то может реализовать классическую MITM?
        2. Насколько я помню RSA не очень хорошо работает на тексте. Ему лучше передавать случайный набор байт (в общем случае хеш). То есть опять же теоретически ваша реализация шифрования RSA не такая уж криптостойкая.
          +1
          Спасибо за ваш интерес. Да, увы, этот метод сейчас уязвим для типичной MITM. Да и разрядность довольно маленькая сейчас захардкоденная. В общем, работать есть над чем :)
          +17
          RSA не рекомендуется использовать для шифрования сообщений, для этого есть много причин. Одного того, что это детерменированный алгоримтм (одинаковый текст всегда дает одинаковый шифр) хватает. А вообще http://en.wikipedia.org/wiki/RSA_(algorithm)#Attacks_against_plain_RSA

          Рекомендованный способ — сгенерить ключ K, зашифровать его открытым ключом PK (RSA), параллельно посчитать его (K, не PK) хэш H(K) (SHA-256), полученный H(K) использовать как ключ для симметричного шифрования (AES) сообщения. Передать результат работы RSA и AES одним сообщением. Получатель расшифровывает своим закрытым ключом SK первую часть, получает ключ K, считает его хэш H(K) и расшифровывает им сообщение.
            0
            еще вариант — перед шифрованием добивать блок рандомными данными фиксированной длины и потом отрезать их с другой стороны. таким образом даже одинаковые сообщения будут отличаться
              0
              Строго говоря, за абзацем, на который вы ссылаетесь, есть абзац про «Padding schemes», который как раз призван бороться с детерминистичностью результата. Я не призываю никого использовать RSA в чистом виде, и я полностью согласен с концепцией генерации сеансовых ключей под защитой RSA, это просто ремарка
              +4
              Ну и конечно же, банальный ajax не вернёт расшифрованный текст обратно на сервер…
                +2
                Интересная идея, но есть и побочный эффект: Нет гарантий, что ваш скрипт сам не отсылает личные сообщения на ваш сервер.
                У меня, например, тоже стоит самописный плагин к вконтакте, но он работает как кейлогер и угоняет переписку всех, кто логинится с моего ноутбука. Опять же — маловероятно что кто-либо из моих знакомых будет ставить подобные плагины, т.к. они будут опасаться, что переписку угонит сам плагин.
                  0
                  Согласен, хотя скрипт довольно простой и с открытым кодом, такая потенциальная опасность есть.
                    0
                    Несмотря на то, что скрипт простой, читать и анализировать его код обычные пользователи не будут. Никто не помешает под видом «супер-секретного-чата-дуров-не узнает» распространять скрипт (не ваш), сливающий все ключи тем же спецслужбам.
                      +1
                      ИМХО, такого типа системы — что-то вроде ChipherSaber, иногда немного более стойкие. Реализуешь сам, сам пользуешься, знакомым/маме/девушке установил. В крайнем случае — по общему стандарту. А нести криптографию в массы, не неся в массы же элементарное знание матчасти — ИМХО бессмысленно.
                    +1
                    > У меня, например, тоже стоит самописный плагин к вконтакте, но он работает как кейлогер и угоняет переписку всех, кто логинится с моего ноутбука

                    Даете друзья попользоваться, или это на злоумышленников нацелено?
                      +2
                      <сарказм>
                      Это расширение для друзей. Позволяет расширять их интерфейс и получать дополнительную информацию о их окружении. Особенно хорошо на девушках работает, сразу видны все «недокументированные» фичи и подводные камни.
                      </сарказм>
                        0
                        фичи девушек вам видны? ;)
                    0
                    Спасибо :)
                    Все программисты — немного параноики :)
                      +6
                      Если вы параноик, это еще не значит, что за вами не следят.
                        0
                        +1
                          +1
                          Как в случае с Хемингуэем.
                          У писателя окружающие, в том числе друзья, видели серьезное психическое расстройство — параною: «жучки» и агенты ФБР мерещились ему постоянно.
                          Он даже проходил лечение.

                          Потом выяснилось, через десятки лет, что за ним действительно следило ФБР.
                        0
                        Лучше сгенерировать ключ и выдать пользователю через prompt, сообщив, что ключ нужно передать собеседнику по другому каналу.
                        Саму возможность отправить ключ через чат ВК отключить, выдав предупреждение об опасности mitm при попытке вставить ключ в чат.
                          0
                          Саму возможность отправить ключ через чат отключить
                          — Месье знает как это сделать?
                            0
                            жаваскриптом при вставке в форму ключа удалять содержимое и сообщать о необходимости отправить данные другим каналом.
                              0
                              Как вы определите, что строка «41325три13245-213ололо5» — это ключ?
                                0
                                Как бы ключ генерируется жаваскриптом, подцепленным greasemonkey, на домен vk.com и им же можно проверить отправку строки 41325три13245-213ололо5 в окно чата, на клиенте.

                                  0
                                  Нет, сразу видно, что вы никогда не сталкивались со страшным зверем пользователем.
                                  Ключ: 413253132452135.
                                  Пользователь забивает: 41325три13245-213ололо5.
                                  Как вы определите, что пользователь забил ключ?
                                  Я к чему это говорю — любая криптографическая система устойчивее ROT13 если и только если ее пользователь имеет элементарные знания о безопасности и желание этими знаниями пользоваться.
                                    0
                                    Сдуру можно и нос оторвать.
                                    Любая система безопасности упрется в человеческую глупость, и тут уж ничего не поделаешь. Просто предупредив о вставке ключа в чат можно обезопасить 99% пользователей, остальные делают обфускацию ключа на свой страх и риск.
                            +1
                            2048-битный ключ — это такой огромный blob, который передать по другому (например, телефону) каналу весьма проблематично. Ключи допустимо передавать и через чат, но выводя отпечатки ключей на обоих сторонах. Тогда можно будет позвонить по тому же телефону и довольно быстро сверить эти отпечатки. Другой вопрос — если ключ используется в течении долгого времени, то где его хранить? cookies, localstorage — оба хранилища легко читаются контактовскими скриптами, а первое, кроме того, еще и на сервер VK посылается. Возможное решение — хранение шифрованного ключа в LocalStorage и запрос через функцию prompt() пароля. Но, я уверен, тут найдется еще куча приемов типа замены функций, благо JS позволяет.

                            Кроме того, можно использовать долговременные ключи только для аутентификации, а сам ключ шифрования получать посредством DH/ECDH, как это делает OTR. Это немного снизит опасность похищения ключей, т.к. предыдущую переписку расшифровать все равно не получится (Perfect forward secrecy).
                            0
                            На хроме не работает, а переходить на мозиллу только ради шифрочата — не хочется :(
                              +1
                              Автор, будьте так любезны: s/ключём/ключом/g
                                0
                                А почему сообщение шифруется только пабликом собеседника? Логично было бы шифровать и своим приватом тоже. Этим можно и MITM усложнить.
                                  0
                                  Тогда надо иметь возможность передать ключик для расшифровки.
                                    0
                                    Шифрование своим приватным ключем называется «цифровая подпись». Но толку все равно никакого, если атакующий может подменять открытые ключи при обмене.
                                      0
                                      «Цифровая подпись» — это не шифрование.

                                      «Цифровая (электронная) подпись» — это добавленный к открытому сообщению его зашифрованный хеш (если совсем уж «на пальцах» объяснять).
                                        0
                                        И чем тогда по-вашему шифруется хэш? Открытым ключем получателя? Тогда что мешает злоумышленнику взять тот же открытый ключ, подделать сообщение и переподписать его?
                                        Разумеется на практике закрытым ключем «шифруется» хэш, но это делается только для того, чтобы размер подпись был небольшим и не зависел от размера подписываемого сообщения. Суть самой цифровой подписи все равно остается в «подписали, зашифровав закрытым ключем отправителя, проверили, расшифровав открытым ключем отправителя».
                                      0
                                      Можно кстати использовать Interlock_protocol
                                      0
                                      Основная идея такого чатика это обскьюрити. Потому что если подобный способ наберет популярность. MITM встроить в сервер будет не так дорого организовать. Сам н времени назад сделал на питоне похожу хрень для xmpp. Оно хорошо, если им пользуется 2 колеки и всем на вас пофиг.
                                        0
                                        Факт самого общения собеседников — никак шифрованием не скрывается.

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

                                        Как, например, сделал Facebook.
                                          +2
                                          Вот подредактировал для хрома(жуткая копипаста и костыли):
                                          gist.github.com/anonymous/9187238
                                            +1
                                            Ах да, вместо ctrl shift V в правом нижнем углу кнопка Patch
                                              0
                                              А как его установить в хроме?
                                                0
                                                Сохранить с расширением .user.js, открыть вкладку с расширениями и мышкой перетащить файл на вкладку
                                                  0
                                                  Почему-то хром мне просто демонстрирует его код. Добавил расширение, кидаю на страницу расширений — и бац, строчки кода на экране.
                                                    0
                                                    Хм, у меня так:
                                              0
                                              >Факт самого общения собеседников — никак шифрованием не скрывается.
                                              для этого имеется другой механизм: СТЕГАНОЛОГИЯ=СТЕГАНОГРАФИЯ + СТЕГАЕОАНАЛИЗ

                                              Only users with full accounts can post comments. Log in, please.