Наверное, все мы когда-нибудь слышали дискуссии о том, что наши мессенджеры читают, что WhatsApp набит бэкдорами, а Telegram прогнулся... Я уже не говорю о тех, чьи аккаунты взломали и вытащили самые откровенные переписки. Согласитесь, не очень хочется писать, когда боишься, что прочитает не тот, кто должен был.

Этот пост не о том, кто и как хранит нашу переписку и куда сливает. Здесь я хочу предложить вам идею разрыва целостности информации. Что же это такое?

Предположим, кто-то отжал у Вас телеграм и теперь читает всё подряд, в надежде найти логин и пароль от сервера, который Вы отправили другу неделю назад. Не пройдет и десяти минут, и сервер у Вас тоже отожмут взломают. Но злоумышленник не знал ни логина, ни пароля. А что если отправлять только пароль, а логин прислать где-то еще. Тогда чтобы взломать сервер, надо будет сперва украсть целых два аккаунта.

Это и есть нарушение целостности информации: Вы делите информацию на кусочки и отправляете разными каналами. Так эту информацию сложнее будет собирать.

Сервисы одноразовых записок

Отправлять информацию разными каналами это, конечно, хорошо, но когда-нибудь к ним ко всем у злоумышленника появится доступ. А у спецслужб он мог быть и раньше. К тому же, собеседнику будет не очень удобно бегать по комнате и ловить ваши сообщения в каждом углу искать данные во всех чатах. Что же делать? Решение есть! В качестве второго канала можно использовать сервис одноразовых записок.

Как это работает?

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

Ссылка на записку
Ссылка на записку

— Почему никто не сможет прочитать записку, кроме собеседника?

Это одноразовая записка. После того, как Ваш друг прочитает послание оно навсегда удалится с сервера. Поэтому когда кто-то еще найдет у Вас эту ссылку и попытается узнать, что там было, то останется с носом ни с чем. А ежели за вами тотальная слежка и записку прочитает кто-то вперёд Вашего друга, то вы оба об этом узнаете, когда не сможете её открыть, и будете впредь общаться лично.

— А админы сайта не узнают мой пароль?

Здесь самое интересное. При создании записки Ваш браузер генерирует случайный ключ и шифрует им записку. Зашифрованное содержание летит на сервер и ждёт Вашего друга, а ключ приписывается в конец ссылки как якорь, который никогда не отправляется на сервер (RFC, раздел 2.4.1). Когда друг открывает записку, он получает с сервера зашифрованное содержание записки, которая сразу же удалится, а его браузер расшифровывает её ключом из ссылки. Бадумс! Остаётся только сохранить себе все данные, а то второй раз записку уже не откроешь.

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

Private-Net.work Notes — что это и чем отличается от других

Private-Net.work — сервис одноразовых записок, созданный мной. Я постарался объединить всё лучшее, что когда-либо видел и что умею сам: минималистичный дизайн и понятный интерфейс сделают сайт удобным в использовании, шифрование AES защитит Вас от утечек, а отсутствие чего-либо лишнего сыграет на благо обоим пунктам. Кстати, насчёт лишнего.

— А пока я пишу записку, не будут ли на неё смотреть скрипты?

Все необходимые для работы сайта библиотеки и javascript-скрипты хранятся непосредственно на моём сервере. Не используется ничего, что хранится на других сайтах и CDN, чтобы быть уверенным, что всё, что используется, не собирает данные с нашего сайта, открытые в браузерах наших пользователей. На сайте нет ни рекламы, ни трекинговых скриптов. Тоже для того, чтобы расшифрованные записки никто не брал.

— Вы ведёте какую-то аналитику? Что собираете?

Ничего не собираем. Что касается аналитики, то у меня есть всего 2 счётчика: количество созданных записок и количество прочитанных. Всё.

— А Вы можете узнать, что я заходил на сайт? Ведь наверняка в логах есть ip адреса?

Я стараюсь не собирать лишней инфы. Поэтому в своих основных журналах запросов к сайту хранится только часть хеша от ip-адреса, чтобы отличать разных посетителей, при поиске ошибок в работе сайта. Ещё хеш ip-адреса используеся в антиспам-системах для защиты от ботов и злоумышленников. Но пока всё работает как надо, никто и на хеш не смотрит.

— Что известно о записке и её авторе?

Когда Вы создаёте записку, ни Вы, ни тот, кто её получит, не связывается с ней. Из-за того, что велико количество записок, которые никто никогда не читает, пришлось установить период, в течении которого записки в любом случае удаляются. Чтобы нельзя было идентифицировать создателя записки по дате её написания, хранится только дата, к которой она должна быть удалена, предоставляя возможность пользователям самим выбирать, как долго она будет храниться. По умолчанию, записки удаляются через 7 дней.

Сейчас в базе данных каждой записке соответствуют 4 поля: её идентификатор, зашифрованное содержимое, дата, к которой она будет удалена, если её не прочитают до этого и счетчик (также необходимый для расшифровки). Вот так выглядит одна из тестовых записок в базе данных:

id

content

delete_date

counter

hHQ8eny

4b4fd1a3

2022-01-23 13:39:22.546147

114186091782275

Форматирование

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

Заключение

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

P.S. Если найдутся желающие поковыряться в моем сайте, скриптах и что-нибудь взломать, то я против не буду. Но прошу рассказать мне о Ваших находках по контактам, указанным на сайте, чтобы я мог всё исправить. Открывать код бэкенда я пока всё же не планировал, так как считаю такой вариант более безопасным в моём случае.

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


  1. Zibx
    04.02.2022 00:00
    +2

    Много думал о подобном.

    Будут не лишними зеркала в tor и i2p.

    Можно ещё сервис заметок нагородить рядом. Хранить на сервере шифрованный bson со всеми данными пользователя, отдавать их любому, но расшифровывать только на клиенте паролём.

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


    1. voneska Автор
      04.02.2022 01:03

      Интересные идеи! Обязательно попробую в свободное время.


  1. vilgeforce
    04.02.2022 00:43
    +3

    Это все хорошо до тех пор доверяют сайту. Причины это делать?

    Установить TLS-соединение между двумя хостами и гнать между ними все что угодно - сложнее, но определенно более секьюрно


    1. voneska Автор
      04.02.2022 01:01

      Не поспоришь. Но тут дело как раз в простоте. Зайти на сайт и сформировать ссылку быстро и доступно любому. А вот с TLS между двумя хостами... Получится поговорить только с истинным единомышленниками))


      1. navferty
        04.02.2022 01:10

        А есть вариант self-hosted развёртывания? В идеале - чтобы можно было в докере 1 контейнер поднять.


        1. voneska Автор
          04.02.2022 01:31
          -3

          Нет, пока для этого не предназначено. Докер при развёртывании вообще не использовал. А исходники, как и упоминал, закрытые.

          Фронтенд и так можно посмотреть, а бэк несложно пишется, если разбираетесь. Поэтому можете взять фронтенд и сделать на свой вкус)


          1. navferty
            04.02.2022 10:57
            +3

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

            Насколько я понимаю, честные варианты монетизации такого сервиса в текущем виде отсутствуют. С другой стороны, если рассмотреть self-hosted решение, можно и продавать расширенную поддержку, если сервис окажется достаточно популярным.

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


            1. voneska Автор
              04.02.2022 11:25

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


              1. alexs963
                04.02.2022 12:39
                +1

                Потому что с гитхаба можно развернуть у себя, не беспокоясь что там в продакшене у автора.


                1. voneska Автор
                  04.02.2022 13:30

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


                  1. alexs963
                    04.02.2022 13:49

                    Не знаю. Думаю средние/крупные проекты живут на платной поддержке/донатах, мелкие просто за идею.


                  1. Xambey97
                    05.02.2022 19:48

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


              1. Vitaliy-L
                06.02.2022 18:16
                +1

                Почему бы на самом сервере не оставить сообщение благодарным пользователям в виде реквизитов для "спасибо"?


                1. voneska Автор
                  06.02.2022 18:19

                  Я планирую когда-то сделать что-то вроде донатов на сайте. Но по поводу "спасибо" пока не думал, кстати. А не сделал ещё из-за того, что времени не было. Да и на благодарных пользователей пока не рассчитывал. Но если Вы благодарны, я благодарен Вам))


            1. Zibx
              05.02.2022 05:50
              +1

              Так код клиента открыт, это же жс, даже если собран бандлером. Из того что я прочитал в посте — сервер выполняет минимум функций. Стало быть достаточно дебаггером пройти путь от «запостить» до аякс запроса чтоб убедиться что всё шифруется на клиенте и ключ из хэша никуда не передаётся.


              1. unsignedchar
                05.02.2022 09:48
                +2

                Осталось убедиться, что сервер всегда будет отдавать именно этот код.



  1. Revertis
    04.02.2022 02:56
    +4

    Проблема тут только одна:

    1. Набирается большая аудитория сайта

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

    3. Юзеры этого не замечают, а вы начинаете заходить в их аккаунты :(


    1. HardWrMan
      04.02.2022 06:48

      Скрипту не нужно отправлять что-то расшифрованное, чтобы оно спалилось снифферами. Достаточно отправить якорь при открывании ссылки и сохранить в БД ключей к запискам. :)


    1. voneska Автор
      04.02.2022 08:03

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


      1. PocketM
        04.02.2022 18:52

        обственно, так может делать любой мессенджер.

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

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


        1. voneska Автор
          04.02.2022 20:26

          У большинства популярных мессенджеров есть веб-версия...


  1. pehat
    04.02.2022 03:23
    +11

    Уже более 30 лет ответ на заглавный вопрос состоит из трёх букв: PGP. Но нет же, пользователи продолжают предпочитать удобство безопасности.


    1. polearnik
      04.02.2022 11:56
      +1

      PGP оно как vim или емакс - идея хороша но UX по 10 бальной шкале примерно на минус гугол


    1. 0default
      04.02.2022 20:22
      +1

      +100500. pgp/gpg - это база, без него нельзя говорить о защите от 3 лиц


  1. ctocopok
    04.02.2022 04:07
    +4

    Пишем супер-секретную записку с очень-важным-паролем.

    Отправляем её другу другим каналом связи, например, whatsapp, telegram, да хотя бы и почтой или смс. Добрая среда общения у друга услужливо делает предпросмотр ссылки, и...

    :goto start

    Не раз обжигался :(


    1. voneska Автор
      04.02.2022 07:56
      +3

      При предпросмотре откроется страница подтверждения открытия записки. На этом этапе содержимое записки клиенту не отправлено и не удалено. Записка останется в БД до тех пор, пока на этой странице кто-то не подтвердит, что действительно хочет посмотреть записку


  1. HardWrMan
    04.02.2022 06:40
    +3

    Это одноразовая записка. После того, как Ваш друг прочитает послание оно навсегда удалится с сервера.

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


    1. voneska Автор
      04.02.2022 08:06
      -1

      Получается так) Но зачем по-Вашему нужна инвалидированная записка? Хранить её в надежде что кто-то взломает аккаунт пользователя сайта и мы вместе с ним посмотрим, что там? Придётся на всякий случай хранить миллиарды записок)


      1. alexs963
        04.02.2022 08:52
        -1

        Если владелец сервера недобросовесный, он просто может взять ключ из access.log и прочитать записку.


        1. voneska Автор
          04.02.2022 09:21
          +4

          Ключ хранится в якоре. Якорь не отправляется браузером, а сервером не принимается. То есть если в ссылке было .../id_записки#ключ, то в логах будет только .../id_записки. Это и сделано для того, чтобы так было сделать нельзя.


  1. DenTsallaty
    04.02.2022 09:23
    +6

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


    1. voneska Автор
      04.02.2022 09:28

      Делиться нечем, придётся прикрыть лавочку. В конце концов когда-то придут ко всем. А к кому не придут, того заблокируют. Может когда-то так и случится. Возможно, к тому моменту станут доступны новые пути достижения поставленных целей. Ну и будем надеяться, что если указанная ситуация и произойдёт, то это будет не скоро.


      1. oreym
        04.02.2022 10:20
        +3

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

        Вы же понимаете, что таким сервисом в первую очередь будут пользоваться криминальные и террористические организации?


        1. voneska Автор
          04.02.2022 10:26
          +2

          Разве есть статья, по которой я не могу прекратить деятельность сервиса в пользу расследования преступлений? Возможно я чего-то не знал. Если поделитесь — буду признателен.


          1. oreym
            04.02.2022 10:45
            +5

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

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

            Ультимотивность требований будет зависеть от вашего социального статуса. Если вы Дуров, то создадут видимость законности действий, демонстрируя обществу вашу очень темную сущность, чтоб когда воплотить угрозы, общество было на стороне государства. Если попроще, то замаячет ряд интересных статей криминального кодекса, с весьма продолжительными сроками, а на этих стадиях можно и в СИЗО посидеть, подумать над своим поведением.


  1. funca
    04.02.2022 09:36
    +2

    Тут вам скорее объясняет, в чем вы не правы, нежели помогут с раскруткой сервиса


    1. voneska Автор
      04.02.2022 10:23
      +1

      Это правда))) Но не все существующие проблемы очевидны, и знать о них — тоже хорошо


      1. Busla
        04.02.2022 11:41
        +1

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


      1. oreym
        04.02.2022 11:45

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


      1. SuAlUr
        04.02.2022 12:12

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

        https://59.ru/text/criminal/2019/12/30/66426355/

        Вас могут просто обвинить в пособничестве терроризму.


  1. ibrin
    04.02.2022 11:22
    +2

    может кто нибудь запилил уже pgp поверх телеги с публичными сертификатами в записной книге?


    1. eps
      04.02.2022 13:32

      (мимо)


  1. eps
    04.02.2022 13:33

    В принципе, эта схема может работать на другой архитектуре.


    • Небольшая, opensource программа шифрует сообщение. На выходе — шифротекст в base64 и секрет. Программа проходит аудит безопасности и шифрования. Программа, естественно, offline.
    • Шифротекст загружается на надёжный, независимый, находящийся в другой стране, хостинг, который гарантирует удаление записи по истечению срока или по факту доступа.
    • Собеседнику присылается ссылка на шифротекст, секрет и инструкция по расшифровке с помощью offline-утилиты из пункта 1

    Есть ли у этой схемы изъяны безопасности? Конечно есть. Но явно меньше, чем у предложения автора.


    Сложно ли это реализовать? Отнюдь нет. Для шифрования можно использовать известные opensource утилиты, хоть даже Zip + base64encode. Для хранения сервисов полно — вроде Pastebin


    Будет ли этим кто-то пользоваться? Вряд ли. Между удобством и безопасностью мы обычно выбираем удобство.


    1. unsignedchar
      04.02.2022 19:42

      Между удобством и безопасностью мы обычно выбираем удобство.


      Выбираем то что более важно. Большинству анонимусов ничего не угрожает — зачем им особенная безопасность?
      Прочие могут воспользоваться аппаратным генератором одноразовых ключей.


    1. qw1
      04.02.2022 20:15

      независимый, находящийся в другой стране, хостинг, который гарантирует
      Если у вас есть такой хостинг, что мешает прямо туда поставить web-чат с SSL + ещё 100500 e2e-шифрований, если не доверяете SSL. И никакого гемора с ключами, программами, ссылками.


  1. eps
    04.02.2022 13:37

    Вообще можно позвонить человеку по другому каналу, через звонилку с end-to-end шифрованием, и продиктовать пароль голосом.


    Аудиозаписи звонков люди обычно не ведут, а e2e шифрование гарантирует, что это не сделает man in the middle


    1. qw1
      04.02.2022 20:12
      +1

      Короткий пароль перебирается, а хотя бы со 128 бит энтропии запаришься диктовать.


      1. alexs963
        04.02.2022 21:36

        10 слов парольной фразы дают 129.5 бит если верить генератору паролей keepassxc


        1. voneska Автор
          04.02.2022 23:28

          Да, но звонить по телефону и диктовать не сильно легче, чем установить какой-нибудь Bitmessage и перейти на него. А тут опять вопрос в удобстве. Если вы хотите передать что-то, но не слишком светить, а собеседник поленится заморачиваться ради вашей безопасности, то слушать пароль по телефону он не станет и так и не узнает вашего послания. А такой вариант хотя бы частично устроит обоих


  1. pureacetone
    05.02.2022 19:36

    В комментариях уже есть упоминание PrivateBin. Селфхостинг, опенсурс, оконечное шифрование.


  1. NurKenKaz
    06.02.2022 18:21

    Я по заголовку ("нарушение целостности") надеялся, что здесь наконец кто-то напишет про цензуру и подделку переписки, когда из писем вырезают куски... А здесь - всего лишь способ добиться приватности при условии доверия любому одному внешнему серверу из двух вместо доверия просто одному внешнему серверу.

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

    Если же вы их не удаляете, а у властей есть доступ, то. Товарищ майор, через N дней/месяцев/лет после отправки, как только у него появляется такое желание, заходит в спецрежиме в мой почтовый ящик и видит ссылку с пароелм в "отправленных", даже если я нажал в почтовом ящике кнопку """""удалить""""". После чего заходит к вам на сервер и смотрит там зашифрованное сообщение, расшифровывает его с помощью ссылки.

    Так что правильно выше пишут - лучше PGP/GnuPG ещё ничего не придумали.