Защищённый сервис обмена текстовыми сообщениями

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

    Основные фичи, которых я добился:

    • Высокая скорость загрузки
    • Если указать пароль, то информация шифруется прямо в браузере и на сервер сохраняется только ничего. Для просмотра данных нужно ввести пароль, чтобы расшифровать в браузере данные, полученные не с сервера.
    • Высокая загрузка центрального процессора
    • Поисковым системам не запрещено индексировать содержимое сайта, потому что нет сайта
    • HTTPS везде

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

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

    Многие подобные сервисы используют алгоритм AES для шифрования, мы решили не отходить от канона, но перестраховались, выполнив шифрование исходной строки несколько раз в такой последовательности:

    image

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

    • буква O: AES-CTR
    • буква M: AES-CBC
    • буква z: AES-GCM

    Образ лягушонка Пепе нам показался наиболее оптимальным для этих целей.

    В результате получился такой сайт:

    image

    После небольшого ожидания мы получили ссылку и пароль к сообщению:

    image

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

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

    image

    Еще раз повторюсь, что мы не отправляем никаких данных на сервер, для того, чтобы в случае взлома сервера, данные не могли быть похищены. Подумав об этом, мы решили сделать код максимально понятным для людей и использовали для данных целей VanillaJS фреймворк (с его основными возможностями вы можете ознакомиться на сайте). Весь код мы уместили внутри index.html для ясности и компактности.

    Буду рад комментариям и отзывам про библиотечку. Так же, если у вас есть идеи для улучшения, прошу их озвучивать.
    Стоит удлинить или сократить длину пароля?

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 35
    • +2
      А как передавать такие длинные линки и пароли? В письме или мессенджере? Тогда смысл теряется — перехватят письмо, перехватят и сообщение. В принципе, можно линк по одному каналу, а пароль — по второму…

      Ну и главный вопрос — когда запуститесь на своем домене в полном масштабе?
      • 0
        Считаем, что ваши замечания вполне уместны.
        Думаю, мы добавим новые безопасные фичи, если окажется востребованным.
        Мы планируем запустить масштабный сбор денег на обновленный домен через indiegogo.
      • 0
        Что то долговато, криптовалось «hello»… Вроде и машина не слабая.
        Но в целом, может где и сгодится.
        • 0
          У меня Алгоритм лягушонка Пепе затрачивает в Chrome секунд 5 на шифровку. На расшифровку примерно столько же.
          В Firefox, кстати, секунд 13.
          • 0
            У меня около минуты, если не больше. Видно проц немного скушало. FF-38.7 (да… да… знаю. старый :) )
            линк на сообщение не получил, а пароль был.
            Списал всё на браузер + куча (порядка 40) открытых вкладок :)
        • 0

          Если кодировать данные в ссылке в HEX или Base32 будет короче. Ну и предусмотреть вместо "#" в ссылке возможность использовать "?"

          • +1
            Если вопросик, то данные будут передаваться на сервер. Этого не стоит делать по соображениям безопасности.
            Возможно, АНБ сможет отследить тебя через логи Github.
            • 0

              Ну тогда укоротить немного ссылку кодированием hex или base32.

              • 0
                Думаю, можно сжать немного, просто стандартную криптографию немного геморно кодировать, и я вставил все наивным способом, чтобы не плодить код.
          • 0
            ОФТОП, все довольно забавно, и работает быстро не больше 5 сек в 10 попытках, но вот фон можно и другой, а то как-то несерьзно ну или хотя бы нет такой большой, в идеале замостить все. /ОФТОП
            • +1
              тогда придется меня алгоритм Пепе на какой-то другой. Есть идеи?
              • 0
                надо сделать ввиде выбираемых стикеров (=
            • 0
              и еще при добавление в поле где находится расшиврованное сообщение
              Заголовок спойлера
              <path d=«M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61

              допустим текста под спойлером и нажатии на кнопку „new pepe link“ ничего не происходит.
              картинка-скрин


              • 0
                код обрезало, в общем там html страница с картой мира в SVG, приходится обновлять
                • 0
                  Или ты не то подметил. Погодь
                  • 0
                    Да не то, даже с исходным текстом ничего не делает)
              • –1
                Ловко ты подметил. Ну я починю.
              • 0
                Область, отвечающая за шифрование, выглядит как у программиста, который не знаком с шифрованием. Ну, либо это сделано для лулзов.

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

                https://en.wikipedia.org/wiki/Multiple_encryption#Independent_keys
              • +1
                Если сильно хочется затормозить перебор, возьмите argon2 или bcrypt и настройте его на параноидальный уровень сложности, зачем городить этот цирк с буквами
                • 0
                  Интересное решение, делать я этого конечно же не буду.
                • 0
                  У меня друг сделал похожий сервис https://encrypt.one/
                  Он использовал похожую идею для передачи паролей (c шифрованием на стороне браузера, но хранением на сервере, и контролем разовости доступа и тп). Там есть ссылка на Github, можно посмотреть как реализовано. И у него изначально стояла задача как безопасно передать файл, так что без хранения на сервере не обойтись.

                  P.S. было желание на Хабре тоже описать как что делалось, но увы, у него вообще нет аккаунта, а у меня недостаточная, чтобы размещать в «я пиарюсь».
                  • 0
                    Все хорошо. Я никому не расскажу.
                    • 0
                      Знакомо, знакомо, но только я использую его чисто для генерации паролей длины свыше 32 символов.
                    • 0
                      image
                      • 0
                        ну а пароль можно сделать покороче и сразу в буфер обмена копировать (благо нативное JS API уже есть) чтобы в браузере нигде в полях ввода не хранился
                        хотя собственно и в защите «от скриншотов» смысла то особо нету. В той же винде любое поле ввода по сути то же окно и по его hWnd можно легко получить контент (за возможные неточности формулировки просьба не бить, под винду я писал в последний раз лет 12 назад, потом только веб) — я такие проги еще в 10 классе на делфях писал) Так что spyware'ю можно и особо не заморачиватся скринами а просто мониторить поля ввода
                        • 0
                          Ваши мысли абсолютно верны.
                          В нашей дорожной карте есть планы создания PEPE_ANTIVIRUS, а в будущем, возможно, PEPE_OS.
                          В этих продуктах будет унаследован дух PEPE_PROTECT.
                        • 0
                          Спасибо большое за фидбек.
                          Проблема исправлена.
                        • 0

                          Эту строчку можно сократить.


                          var href = location.protocol + '//' + location.host + '/#' + pepeLanguage

                          до


                          var href = '#' + pepeLanguage

                          Браузер сам подставит адрес страницы при копировании ссылки.

                          • 0
                            Нельзя. Пожалуй, я удлиню. Копировать относительную ссылку плохо.
                            • 0

                              Копируется полная. Браузер автоматом подставляет недостающую часть.

                              • 0
                                Вообще, думаю, ты прав. Можно я так оставлю на всякий?
                                • 0

                                  Можно и так оставить но вылезут проблемы когда в url страницы появятся не учтённые части.


                                  <схема>:[//[<логин>:<пароль>@]<хост>[:<порт>]][/]<URL‐путь>[?<параметры>][#<якорь>]

                            • 0
                              var href = location.protocol + '//' + location.host + location.pathname + '#' + pepeLanguage
                              

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.