
Вышла новая версия Ad Nihilum 0.4.3 — минималистичного сервиса для безопасного обмена зашифрованными сообщениями по принципу «прочитал — сжег». Решение в первую очередь ориентировано на развертывание пользователями на собственных мощностях (self-hosting).
Серверная часть здесь выступает лишь в роли «глухого» хранилища. Все процессы шифрования и дешифровки выполняются исключительно на стороне клиента в браузере с использованием алгоритма AES-GCM.
Особенности проекта
- Конфиденциальность: все данные шифруются локально, сервер не имеет доступа к ключам.
- Защита паролем: предусмотрен дополнительный слой шифрования, информацию о котором нельзя извлечь из ссылки или получить со стороны сервера.
- Минимализм: кодовая база насчитывает около 2200 строк на C (сервер) и 600 строк на JS (клиент), что делает проект удобным для аудита безопасности.
- Легкость: единственная внешняя зависимость сервера — библиотека libmicrohttpd.
- Гибкость: предоставляется инструкция для запуска локального сервиса без необходимости иметь публичный IP-адрес.
- Мобильность: Ad Nihilum работает на Android, для сборки в Termux предусмотрен специальный скрипт.
- Производительность: сервер реализован как однопоточное синхронное приложение.
Что нового в версии 0.4.3
Масштабный редизайн
- Разделены страницы для отправки и получения данных, соответствующим образом оптимизирован клиентский код.
- Дизайн интерфейса был значительно переработан с учетом пожеланий сообщества.
- Появились «простой» и локальный клиенты: добавлен упрощенный дизайн, а страницы клиента теперь можно сохранить на устройство и запускать локально через
file://.
Безопасность
- Внедрена политика CSP для эффективной защиты от XSS-атак.
- Сервер теперь отправляет заголовок HSTS.
Другие изменения
- Проект сменил название (ранее был известен как Epha-ots).
- Зарегистрирован официальный домен adnihilum.net.
- Реализована поддержка TLS через Let’s Encrypt.
- Упрощена процедура работы с файлами, осуществлен переход на fat-pointers.
- Проведены работы по исправлению мелких багов, настроены автоматическая минификация JS и сборка через CMake.
Обзор протокола
При создании сообщения система генерирует три случайных значения: ключ K (256 бит), вектор инициализации N (96 бит) и соль S (128 бит). Идентификатор (ID) выводится из K и S с помощью HKDF на базе SHA-256.
При использовании пароля:
- Ключ Pk выводится из пароля и соли S с применением PBKDF2 (SHA-256, 800 000 итераций).
- Данные шифруются через AES-GCM с использованием ключа Pk, IV (N) и добавлением аутентифицированных данных (aad).
После этого добавляется двухбайтовый тег: первый байт указывает на наличие или отсутствие пароля (0x73 — да, 0x13 — нет), а второй всегда равен 0x37. Финальный шифротекст получается путем повторного шифрования результата через AES-GCM с теми же параметрами.
Итоговая строка blob (N + S + ct) отправляется на сервер вместе с ID. Сервер не может подменить данные, так как клиент проверяет их еще до дешифровки. При этом ключ K никогда не передается на сервер.
Ссылка для получателя выглядит как origin/#ID/K, где параметры представлены в формате base64url. Когда получатель переходит по ссылке, клиентский JavaScript извлекает ID и K из хеша, загружает зашифрованный массив с сервера, проверяет его целостность и запрашивает пароль, если это необходимо.
Лицензия
Проект распространяется на условиях лицензии GPLv3.





