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

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

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

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

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

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

image

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

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

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

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

image

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

image

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

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

image

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

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

Проголосовало 76 человек. Воздержалось 90 человек.

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

Поделиться с друзьями
-->

Комментарии (35)


  1. Markscheider
    19.05.2017 16:43
    +2

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

    Ну и главный вопрос — когда запуститесь на своем домене в полном масштабе?


    1. mitinsvyat
      19.05.2017 16:48

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


  1. hexman
    19.05.2017 16:52

    Что то долговато, криптовалось «hello»… Вроде и машина не слабая.
    Но в целом, может где и сгодится.


    1. mitinsvyat
      19.05.2017 16:53

      У меня Алгоритм лягушонка Пепе затрачивает в Chrome секунд 5 на шифровку. На расшифровку примерно столько же.
      В Firefox, кстати, секунд 13.


      1. hexman
        19.05.2017 16:56

        У меня около минуты, если не больше. Видно проц немного скушало. FF-38.7 (да… да… знаю. старый :) )
        линк на сообщение не получил, а пароль был.
        Списал всё на браузер + куча (порядка 40) открытых вкладок :)


  1. ivan386
    19.05.2017 17:08

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


    1. mitinsvyat
      19.05.2017 17:14
      +1

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


      1. ivan386
        19.05.2017 17:30

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


        1. mitinsvyat
          19.05.2017 17:38

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


  1. den_golub
    19.05.2017 18:08

    ОФТОП, все довольно забавно, и работает быстро не больше 5 сек в 10 попытках, но вот фон можно и другой, а то как-то несерьзно ну или хотя бы нет такой большой, в идеале замостить все. /ОФТОП


    1. mitinsvyat
      19.05.2017 18:16
      +1

      тогда придется меня алгоритм Пепе на какой-то другой. Есть идеи?


      1. cagami
        21.05.2017 22:07

        надо сделать ввиде выбираемых стикеров (=


  1. den_golub
    19.05.2017 18:14

    и еще при добавление в поле где находится расшиврованное сообщение

    Заголовок спойлера
    <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“ ничего не происходит.
    картинка-скрин


    1. den_golub
      19.05.2017 18:19

      код обрезало, в общем там html страница с картой мира в SVG, приходится обновлять


      1. mitinsvyat
        19.05.2017 18:20

        Или ты не то подметил. Погодь


        1. den_golub
          19.05.2017 18:22

          Да не то, даже с исходным текстом ничего не делает)


          1. mitinsvyat
            19.05.2017 18:25
            -1

            вродь я починиль


    1. mitinsvyat
      19.05.2017 18:19
      -1

      Ловко ты подметил. Ну я починю.


  1. m8rge
    19.05.2017 19:29

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

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

    https://en.wikipedia.org/wiki/Multiple_encryption#Independent_keys


    1. mitinsvyat
      19.05.2017 19:30

      тут разные ключи


  1. Scratch
    20.05.2017 12:28
    +1

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


    1. mitinsvyat
      20.05.2017 13:03

      Интересное решение, делать я этого конечно же не буду.


  1. Killer
    21.05.2017 10:12

    У меня друг сделал похожий сервис https://encrypt.one/
    Он использовал похожую идею для передачи паролей (c шифрованием на стороне браузера, но хранением на сервере, и контролем разовости доступа и тп). Там есть ссылка на Github, можно посмотреть как реализовано. И у него изначально стояла задача как безопасно передать файл, так что без хранения на сервере не обойтись.

    P.S. было желание на Хабре тоже описать как что делалось, но увы, у него вообще нет аккаунта, а у меня недостаточная, чтобы размещать в «я пиарюсь».


    1. mitinsvyat
      21.05.2017 17:29

      Все хорошо. Я никому не расскажу.


    1. den_golub
      22.05.2017 09:14

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


  1. Cyberneticist
    22.05.2017 12:30

    image


    1. Cyberneticist
      22.05.2017 12:35

      ну а пароль можно сделать покороче и сразу в буфер обмена копировать (благо нативное JS API уже есть) чтобы в браузере нигде в полях ввода не хранился
      хотя собственно и в защите «от скриншотов» смысла то особо нету. В той же винде любое поле ввода по сути то же окно и по его hWnd можно легко получить контент (за возможные неточности формулировки просьба не бить, под винду я писал в последний раз лет 12 назад, потом только веб) — я такие проги еще в 10 классе на делфях писал) Так что spyware'ю можно и особо не заморачиватся скринами а просто мониторить поля ввода


      1. mitinsvyat
        22.05.2017 23:10

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


    1. mitinsvyat
      22.05.2017 23:07

      Спасибо большое за фидбек.
      Проблема исправлена.


  1. ivan386
    23.05.2017 11:33

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


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

    до


    var href = '#' + pepeLanguage

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


    1. mitinsvyat
      23.05.2017 18:32

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


      1. ivan386
        23.05.2017 19:35

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


        1. mitinsvyat
          24.05.2017 02:05

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


          1. ivan386
            24.05.2017 08:59

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


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


    1. mitinsvyat
      23.05.2017 18:35

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