LINUX.ORG.RU

Ad Nihilum 0.4.3

 , , , ,


1

2

Состоялся релиз Ad Nihilum 0.4.3 — минималистичного сервиса для обмена зашифрованными сообщениями по принципу «прочитал — сжег», ориентированного в первую очередь на self-hosting.

Cервер выступает лишь в роли глухого хранилища. Шифрование и расшифровка происходят исключительно на стороне клиента, в браузере (через AES-GCM).

Особенности

  • локальное зашифрование и расшифрование, сервер никогда не видит ключа;
  • поддержка дополнительного слоя шифрования паролем, о котором (1) не может узнать сервер, (2) нельзя узнать по передаваемой ссылке;
  • проект содержит порядка 2200 строк серверного кода на Си и 600 строк клиентского кода на JS, что упрощает аудит;
  • Ad Nihilum зависит только от libmicrohttpd. Для генерации кодов QR поставляется модифицированная версия QRCode.js;
  • прилагается инструкция по быстрому поднятию локального сервиса без внешнего IP;
  • Ad Nihilum работает и на Android, приложен соответствующий скрипт для сборки в Termux;
  • однопоточный и синхронный сервер.

Изменения

Масштабный редизайн

  • Разделены страницы отправки и получения сообщений, соответствующий клиентский код.
  • Вообще дизайн был сильно изменён и скорректирован с учётом пожеланий лорчаню
  • «Простой» и локальный клиенты:
    • добавлен клиент с упрощённым дизайном https://adnihilum.net/simple;
    • клиентские страницы можно сохранить локально и использовать из file://.

Браузерные политики

  • внедрен CSP для борьбы с XSS;
  • сервер шлёт HSTS.

Прочие изменения

  • проект переимнован из Epha-ots;
  • куплен домен adnihilum.net;
  • TLS обеспечивается при помощи Let’s Encrypt, это стоит иметь ввиду (денег нет);
  • упрощена работа с файлами;
  • переход на fat-pointerы;
  • пофикшены мелкие баги;
  • авто-jsminify и сборка клиентских файлов при сборке через CMake.

Обзор протокола

Сгенерировать три случайных значения: ключ K, вектор инициализации N и соль S. K — 256 бит, N — 96 бит, S — 128 бит.

Вывести ID из K и S с помощью HKDF на основе SHA-256.

Сформировать строку дополнительных аутентифицированных данных aad — это просто строка вида: id=ID

Если пользователь задал пароль:

  • вывести Pk из пароля и S с помощью PBKDF2, SHA-256, 800000 итераций;
  • одна и та же соль используется для всего;
  • зашифровать данные с помощью AES-GCM, используя ключ Pk, IV/nonce N и передав aad.

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

Первый байт имеет значение: он показывает, были ли данные зашифрованы паролем:

  • 0x73 — данные зашифрованы паролем;
  • 0x13 — данные не зашифрованы паролем.

Второй байт — постоянное значение 0x37.

Снова зашифровать результат с помощью AES-GCM, используя тот же iv = N и тот же aad. Это даёт финальный шифротекст ct.

Склеить байты в строку: blob = N .. S .. ct

Отправить blob на сервер вместе с ID. Сервер возвращает blob по этому ID и не может его подменить: клиент сначала проверит ID с использованием N и K ещё до расшифровки, а затем — через aad.

Клиент хранит K. K никогда не отправляется на сервер. Pk тоже не отправляется; всё, что связано с паролем, очищается из памяти.

Клиент формирует ссылку: origin/#ID/K

Здесь ID и K — строки в формате base64url.

Когда получатель открывает ссылку:

  • браузер отбрасывает всё, что начинается с #; это называется location.hash;
  • клиентское приложение загружается с сервера;
  • по моему мнению, это главная дыра: мы фактически снова упираемся в то, что «TLS дырявый»;
  • однако ничто не мешает хранить клиент офлайн;
  • в идеале должен быть отдельный standalone-клиент.

Клиентский JavaScript проверяет location.hash, и если там есть ID и K, он загружает данные с сервера.

Затем он проверяет их, расшифровывает и, если нужно, запрашивает пароль и расшифровывает ещё раз.

Лицензия

Проект распространяется под GPLv3.

>>> Страница проекта на GitHub

>>> Сервис

★★★★

Проверено: CrX ()
Последнее исправление: dataman (всего исправлений: 2)

В кои то веки что то высокотехнологичное.

kirill_rrr ★★★★★
()
Ответ на: комментарий от Set440

Я не разбираюсь! :c Можешь побеседовать со мной только как с дилетантом.

А что, пароль+соль подлиннее мало? Соль должна быть уникальной каждый раз, зачем тебе юзернейм, который будет известен атакующему так же, как и соль? Что значит «секретная соль»?

sha512

Быстрый же очень хеш, если есть свобода и нужда, я бы юзал, потвикав, Argon2id.

BruteForce ★★★★
() автор топика
Ответ на: комментарий от BruteForce

Быстрый же очень хеш

а говоришь, не разбираешься.

спасибо, постараюсь сделать лучше.

«секретная соль» — это как, например, у вордпресса. Хранится в пшп-файле, который генерится при установке системы, и прочитать из него «никак нельзя» (с точки зрения юзера).

КСОР Хэш1 х Хэш2 — нужно чтобы хэши одинаковых паролей у юзеров не совпадали. И, как-мне-кажется — это позволяет замазать финальный хэш от Радужных Таблиц.

мне кажется, я на правильном пути, но выбрал слабые хэши… но там всё равно никакие хэши никому не видны — потому, ещё не ломанули.

Set440 ★★
()
Ответ на: комментарий от Set440

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

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

Aceler ★★★★★
()
Ответ на: комментарий от pihter

Только самописное, не браузер точно

С учётом того, что это нечто должно уметь работать по HTTP и выполнять JS, то практически браузер.

monk ★★★★★
()
Ответ на: комментарий от no-dashi-v2

Только со своим же CA.

Зачем CA для stunnel? /etc/ssh/*.pub достаточно.

monk ★★★★★
()
Ответ на: комментарий от BruteForce

Вариант два: сделать нативные клиенты.

Это идеальный вариант. Чтобы тоже были достаточно простые для быстрого аудита.

monk ★★★★★
()

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

Leupold_cat ★★★★★
()
Ответ на: комментарий от Xant1k

Милостивый Государь, извольте упоминать Его GNU/ФСБ-величество, используя полный титул.

Set440 ★★
()
Ответ на: комментарий от Set440

КСОР Хэш1 х Хэш2 — нужно чтобы хэши одинаковых паролей у юзеров не совпадали. И, как-мне-кажется — это позволяет замазать финальный хэш от Радужных Таблиц.

Проблема XOR — в обратимости. Когда мы добавляем то, что usernameы — короткие и известные атакующему сроки, вот этот кусочек sha512(пароль) xor sha512(юзернэйм) начинает выглядеть слабо.

«секретная соль» — это как, например, у вордпресса. Хранится в пшп-файле, который генерится при установке системы, и прочитать из него «никак нельзя» (с точки зрения юзера).

https://en.wikipedia.org/wiki/Pepper_(cryptography)

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

В общем, если хочется велосипедить, (1) везде, где ксор, можно смело менять на конкатенацию+хеш sha256(a..b), и (2) стоит добавить классической соли к перецу, например 32 байта S и 32 байта P и смешивать их так же, sha256(a..b).

А так я бы обращал внимание на известные схемы. В сабже юзаю PBKDF2 для получения ключа из пароля, c SHA-256, 800000 итераций.

Быстрый же очень хеш

а говоришь, не разбираешься.

А что тут разбираться:

# openssl на моём телефоне 2 миллиона в секунду:
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
sha512           31985.23k   128267.20k   258740.74k   416474.11k   510709.14k   514113.54k

# openssl на самом слабом ядре моего ноута 3 миллиона в секунду:
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
sha512           50562.37k   206797.18k   396958.21k   623997.95k   748666.88k   759611.39k
# (можно сделать прикидку в 100млн/с для всего проца)

# hashcat на видяхе моего ноута через OpenCL один с четвертью миллиард в секунду:
---------------------------
* Hash-Mode 1700 (SHA2-512)
---------------------------

Speed.#01........:  1280.7 MH/s (88.36ms) @ Accel:9 Loops:1024 Thr:512 Vec:1
BruteForce ★★★★
() автор топика
Ответ на: комментарий от etwrq

Если говорить о сервисе, то себе, родственникам, друзьям и тем, у кого схожие юзкейсы и доверяет мне

Если говорить о софте, то всем, кто не доверяет мне

BruteForce ★★★★
() автор топика
Ответ на: комментарий от Leupold_cat

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

Вот тут делают https://delta.chat/ru/

Ещё у меня мечта поверх телеги OTR намазать, но тут писали, что кто-то что-то такое делал и его нещадно банили.

BruteForce ★★★★
() автор топика
Ответ на: комментарий от etwrq

Что такое RT? Тебя беспокоит, где сервер? Сервер в Нюрнберге. Ты можешь использовать свой телефон в качестве сервера. TTL секретов — 1 час, если тебя «примут бандиты» — едва ли они получат доступ к памяти adnihilum за это время.

BruteForce ★★★★
() автор топика
Ответ на: комментарий от BruteForce

я к тому что ты пропагандируешь инструмент, воспользуйся своим, пропагандируемым, инструментом, чтобы ретранслировать RussiaToday(RT) на территории США.
заодно проверим надёжность/проблемы.
инфраструктура и исполнители на твоё усмотрение.
заодно и чекним ТСПУ США.

etwrq ★★★★★
()
Последнее исправление: etwrq (всего исправлений: 2)

автор молодец, хороший и нужный сервис

z0idator
()
Ответ на: комментарий от r--r--r--

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

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

Дело не совсем в этом. HTTPS это транспортный слой. Тебя же не удивляет, что в каждом первом линукс-дистрибутиве пакеты подписаны GPG-подписями, хотя в то же время они качаются через HTTPS.

vbr ★★★★★
()
Ответ на: комментарий от BruteForce

Не думаю, что АНБ будет интересно одновременно дешифровать трафик до сервера, а потом воровать ключ из ссылки, которая передаётся по ватсапу, и дешифровать шифрованые им блобы и затем узнавать, что там всё опять AES шифровано, ключем из имени собаки моей сестры.

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

Как вариант - придут к твоему хостеру. Или к админу, работающему у твоего хостера.

Суть в том, что твой HTTP-сервер будет раздавать уязвимого клиента конкретному человеку с конкретным IP-адресом. А остальным он будет раздавать обычного клиента. И эти изменения в репозитории никто не увидит. Вот эта главная угроза, которую едва ли понятно, как купировать, с сохранением браузерного клиента.

vbr ★★★★★
()
Ответ на: комментарий от pihter

В ноде, конечно, можно, вообще без проблем.

На самом деле в браузере тоже начали появляться такие технологии. Называется Direct Socket. Не прям на рандомном сайте, нужно его «установить», т.н. Isolated Web App, чтобы такие права появились у странички.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

Тебя же не удивляет, что в каждом первом линукс-дистрибутиве пакеты подписаны GPG-подписями,

Они подписаны подписями, потому что:

  1. изначально раздавались по ftp / http (без s)
  2. во всей цепочке производства пакетов до сих наверняка нет верификации серверов
  3. всем лень переделывать

Для клиент - сервер отношений https достаточно.

r--r--r--
()
Последнее исправление: r--r--r-- (всего исправлений: 1)
Ответ на: комментарий от r--r--r--

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

Всё дело в End To End доставке. От билд сервера до клиента. Слишком много промежуточных слабо контролируемых узлов между этими точками.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

Для клиент - сервер отношений

Всё дело в End To End доставке.

В web end-to-end == "веб-клиент - веб-сервер".

От билд сервера

В вебе и, соответственно, модели безопасности веба нет никакого "билд сервера".

r--r--r--
()
Ответ на: комментарий от vbr

Как вариант - придут к твоему хостеру. Или к админу, работающему у твоего хостера.

Вот эти варианты) Просьбы ко мне исключены

Как вариант - придут к твоему хостеру. Или к админу, работающему у твоего хостера.

Поэтому я и не предлагаю сервис вне тех рамок, которые описал. Кому надо такое, но с бОльшими гарантиями — пусть (1) пускают на своём железе, от телефонов до vps в рандомных странах, (2) держат HTML файлик у себя и у реципиента или (3) помогут с нативными клиентами. Я вот хочю постквантовую криптографию, а не AES.

BruteForce ★★★★
() автор топика
Ответ на: комментарий от BruteForce

Я вот хочю постквантовую криптографию, а не AES.

AES не ломается квантовым компьютером

vbr ★★★★★
()
Ответ на: комментарий от vbr

Да, прости. В голове смешалось DH и AES как части TLS. Я хотел сказать, что хочу безопасного канала между клиентом и сервером, а ещё не у всех браузеры умеют MLKEM.

BruteForce ★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.