Обновить
1
Эмиль@elatypovread⁠-⁠only

Пользователь

Отправить сообщение

«Разблокируй телефон» — как я реализовал фейковый мессенджер для допроса

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели21K

Привет, Хабр! Я разрабатываю open-source мессенджер Xipher (C++/Android), и одна из фич, которую пришлось проектировать особенно тщательно — Panic Mode. Это система правдоподобной отрицаемости (plausible deniability): при вводе специального PIN-кода мессенджер показывает полностью фейковую, но убедительную базу данных с поддельными чатами, а параллельно отправляет скрытый SOS-сигнал на сервер.

В статье разберу архитектуру целиком — от криптографического разделения баз до генерации правдоподобных фейков и маскировки panic-алерта под рутинный сетевой запрос. Весь код — из реального проекта.

Исходники открыты — ссылка на GitHub в конце статьи.

Читать далее

Как я написал E2EE-мессенджер на Spring Boot и WebCrypto — и почему сервер не видит сообщения

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели11K

Привет, Хабр.

Я Java-разработчик и в основном работаю с backend: Spring Boot, базы данных, интеграции, авторизация, WebSocket — всё то, что обычно находится за интерфейсом.

В какой-то момент я поймал себя на мысли: я каждый день пользуюсь мессенджерами, но плохо понимаю, как они устроены внутри. Окей, JWT, WebSocket, PostgreSQL, Redis — это понятно. Но что технически означает фраза “end-to-end encryption”? Как сервер доставляет сообщения, если он не должен их читать? Где живут ключи? Что хранится в базе? Что происходит, если у пользователя два устройства?

Решил разобраться через практику. Написал мессенджер с нуля. Назвал Chaos Messenger.

Сразу честно: криптографическую часть я изучал вместе с Claude и ChatGPT — читал спецификации X3DH и Double Ratchet, разбирал примеры, задавал вопросы, пока не сложилась цельная картина. Frontend тоже делался с активной помощью ChatGPT: я backend-разработчик, React для меня не основная среда. Но архитектура, backend, интеграция WebCrypto, модель конвертов, хранение сообщений и принципиальные решения — мои.

Для меня AI здесь был не заменой понимания, а инструментом — примерно как документация, Stack Overflow и ревью коллег. Без понимания threat model и архитектуры такой проект всё равно не собрать.

В статье расскажу, как работает E2EE изнутри: как устанавливается сессия через X3DH, как каждое сообщение получает отдельный ключ через Symmetric Ratchet, почему сервер хранит только зашифрованные конверты, и какие ошибки я допустил по дороге.

Стек: Spring Boot 3, React 18, WebCrypto API, PostgreSQL, Redis, WebSocket/STOMP, Prometheus, Grafana.

Читать далее

Это — всё что вам надо знать о белых списках: как устроены и 6 способов обхода

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели131K

Думаю, вы уже в курсе, что происходит в РФ с белыми списками: работают белые списки, ТСПУ в режиме drop-all пропускает только одобренные IP + SNI, рунет медленно, но верно становится интранетом

Мы просканировали 46 млн российских IP-адресов, нашли 63 тысячи выживших, разобрали работу ТСПУ. И главное - актуальные методы пробива (от Serverless-функций и покупки VPS с белым IP до туннелей через WebRTC).

Читать далее

Как я сделал шифрование поверх MAX, когда приватность стала роскошью

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели61K

Как я без Mac, с помощью Claude AI и GitHub Actions, создал кроссплатформенное приложение для шифрования сообщений поверх любого мессенджера. Android на Kotlin, iOS на Swift без MacBook, десктоп на Python. AES-256, три платформы, два отказа от Apple и один баг с буквой «а».

Читать далее

Чёрное окошко Linux: погружение в подсистему TTY

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели27K

Начав изучать тему терминалов в Linux, вы можете почувствовать, что по отдельности вроде бы всё понятно, но разница между понятиями и их суть всё равно ускользает. Консоль, терминал, TTY, виртуальная консоль, виртуальный терминал, эмулятор терминала, оболочка — это просто «вот то чёрное окошко, куда вводят команды Linux». На самом деле за этим окошком скрывается целая цепочка разных сущностей — от компонентов ядра до пользовательских программ. Цель данной статьи — объяснить подсистему TTY и избавить вас от этого неприятного ощущения.

Читать далее

Обманываем atomic

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели6.6K

Давайте обманем атомик. Вот две функции - можно ли, общаясь к атомику только с их помощью, увидеть некорректное состояние ?

void write(std::atomic<int64_t>& x, int64_t v) { x.store(v, std::memory_order_seq_cst); } int64_t read(std::atomic<int64_t>& x) { return x.load(std::memory_order_seq_cst); }

Читать далее

SIMDe, дополнение к DOD архитектуре

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели12K

Привет, Хабр!

Для начала хочу сказать огромное спасибо всем, кто прочитал и прокомментировал мою прошлую статью про Data-Oriented Design.

Честно говоря, я ожидал дискуссии, но такой накал страстей вокруг кэш-миссов, структур данных и «смерти ООП» меня приятно удивил. Приятно видеть, что оптимизация и понимание того, как данные текут через железо, всё еще волнуют сообщество.

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

Многие из вас совершенно справедливо заметили: DOD — это круто, но какой в нем смысл, если мы упираемся в зоопарк архитектур? Мы раскладываем данные в памяти идеально ровно, но как только пытаемся применить к ним SIMD-инструкции (чтобы получить тот самый 10-кратный буст), мы попадаем в ловушку вендор-лока. Написал под Intel — не работает на ARM. Написал под ARM — не заведется в браузере.

Сегодня я хочу показать инструмент, который снимает этот вопрос и делает «низкоуровневую магию» действительно универсальной.

Речь пойдет о SIMDe (SIMD Everywhere).

Читать далее

Что же такое DOD и почему мы это забыли?

Время на прочтение5 мин
Охват и читатели9.7K

Мы привыкли думать абстракциями. Нас учили, что мир состоит из объектов: у «Собаки» есть метод Bark(), а у «Пользователя» — поле Email. Мы тратим недели на споры о чистоте интерфейсов и иерархии наследования, свято веря, что инкапсуляция — это ключ к успеху. Но пока мы строим эти ментальные замки, наш процессор... скучает.

Современный CPU — это невероятно мощный вычислительный монстр, способный обрабатывать миллиарды операций в секунду. Но у него есть ахиллесова пята — память. Пока ваш код прыгает по указателям от одного объекта в куче к другому, процессор простаивает в ожидании данных, совершая те самые «cache misses».

Data-Oriented Design (DOD) — это не просто очередной паттерн. Это «таблетка реальности», которая предлагает перестать проектировать программы вокруг сущностей и начать проектировать их вокруг данных.

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

Читать далее

Маски, Каскады, использование масок вместо циклов(В некоторых случаях) + Атомарные инструкции

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели9.7K

Привет Хабр!

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

Читать далее

Элитный вайбкодинг

Уровень сложностиПростой
Время на прочтение13 мин
Охват и читатели70K

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

Вы же хотели узнать как обстоят дела в современном ИТ?

Читать далее

[Перевод] Envoy модель потоков (Envoy threading model)

Время на прочтение10 мин
Охват и читатели3.7K
Привет, Хабр! Представляю вашему вниманию перевод статьи «Envoy threading model» автора Matt Klein.

Данная статься показалась мне достаточно интересной, а так как Envoy чаще всего используется как часть «istio» или просто как «ingress controller» kubernetes, следовательно большинство людей не имеют с ним такого же прямого взаимодействия как например с типовыми установками Nginx или Haproxy. Однако если что-то ломается, было бы хорошо понимать как оно устроенно изнутри. Я постарался перевести как можно больше текста на русский в том числе и специальные слова, для тех кому больно на такое смотреть я оставил оригиналы в скобках. Добро пожаловать под кат.
Читать дальше →

Установка Max отдельно от всего в рабочем профиле на Android

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели214K

В этой статье подробнее освещу подход с установкой недоверенного мессенджера Max в "рабочий профиль" на Android, который отгораживает приложения от основного профиля. Обойдемся сегодня без покупки нового гаджета.

Из-за чего весь сыр-бор? Вчера вышла статья, что потребитель пошел по магазинам, искать себе новый телефон для установки туда мессенджера Макс. На Хабре комментаторы в большинстве своем решили: это всё из-за недоверия народного! Допустим. А что, сразу телефон отдельный покупать надо?

Читать далее

Единый принцип деления в архитектуре

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели12K

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

Когда я стал архитектором я задавался вопросами: зачем же мы наплодили 200 микросервисов? стоит ли выделять новый или пора объединять?

Когда я стал руководителем я задавался вопросами: как разделить людей на команды разработки? стоит ли создавать новый отдел или расширить ответственность старого?

И всё это хотелось сделать оптимальным эффективным образом.

И я понял, что все эти вопросы сводятся к ряду единых принципов о том как делить, которые можно применять на любом уровне. И этим важным для себя осознанием, после 20 лет в разработке, я хочу поделиться.

Читать далее

Корутины C++20

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели12K

Думаю, многие согласятся, что реализация корутин в C++20 с первого взгляда выглядит страшновато, а документация скорее более запутывает, чем вносит ясность. Многие воспринимают работу приостанавливаемых функций как некую магию со своими странными co_abracadabra()'ми и прочими promise_type'ами.
В этой статье я хочу разоблачить якобы стоящую за корутинами магию, сдёрнуть покровы и показать, что спрятано под столом у фокусника.

Читать далее

Как работает single sign-on (технология единого входа)?

Время на прочтение7 мин
Охват и читатели283K

Что такое single sign-on?


Технология единого входа (Single sign-on SSO) — метод аутентификации, который позволяет пользователям безопасно аутентифицироваться сразу в нескольких приложениях и сайтах, используя один набор учетных данных.


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


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

Читать дальше →

Итоги «заблокированного» 2025 года

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели143K

Привет! Это команда AmneziaVPN, и нам есть о чём вспомнить вместе с вами в уходящем 2025 году. Он стал временем непрерывной борьбы VPN-сервисов с цензорами, что привело к технической эволюции с обеих сторон.

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

Читать далее

Лаконичный макрос defer для C++17

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели13K

Ручное управление ресурсами в низкоуровневом си-подобном коде на C++ — довольно хлопотное занятие. Создание достойных RAII-врапперов для каждого используемого сишного API не всегда практично, а использование подходов с goto cleanup или множеством вложенных if (success) вредит читаемости кода.

Макрос defer как никогда кстати! Отложенная лямбда будет выполнена при выходе из области видимости, независимо от того, будет ли выполнен return, брошено исключение, или даже выполнен goto наружу. Данный макрос по-настоящему zero-cost и не зависит от рантайма C или стандартной библиотеки, поэтому его можно использовать даже в разработке под ядро ОС.

Читать далее

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Инженер встраиваемых систем, Системный инженер
Старший
От 4 000 $
Git
Linux
Linux kernel
Lua
C
Python
Алгоритмы и структуры данных
Bash
Embedded linux
Системное программирование