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