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)

ИМХО, вариант разметки https://adnihilum.net/simple должен стать основным, с добавлением ссылки на подробности справа внизу.

CrX ★★★★★
()

в браузере

Главное - верить, что сервер не пришлёт модифицированный персонально под тебя код.

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

То, что HTML можно сохранять локально это очень хорошо. В таком варианте претензий меньше.

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

по принципу «прочитал — сжег»

Слабый принцип, нужен классический «перед прочтением сжечь».
«Ad Nihilum» © (shazam.com) без ключа не послушать? :)

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

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

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

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

Кто-то залез к тебе на сервер и подменил тебе js. Этот js точно также подписан этим же сертификатом.

Aceler ★★★★★
()

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

Хром точно отправит расшифрованное своему хозяину. Есть гарантия, что огнелис не отправит?

Или надо ещё и браузер свой для работы с этим сервером.

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

Я так надеялся, что ты захочешь сравнить вероятности этих двух событий…

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

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

stunnel через свой сертификат это гарантирует. Это как раз не проблема.

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

Главное - верить, что сервер не пришлёт модифицированный персонально под тебя код.

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

А сторонние сервисы да — это всегда на доверии.

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

Можно. Ещё злой враг может проникнуть на сборочный сервер, на компьютер разработчика, на сервер дистрибуции ПО для разработки, на сборочный сервер ПО для разработки, на компьютер разработчика ПО для разработки, на сервер дистрбуции апдейтов операционных систем, на сборочный сервер апдейтов операционных систем, на компьютер разработчика апдейтов операционных систем, на сервер дистрибуции ПО для разработки апдейтов операционных систем, на сборочный сервер сборки ПО для разработки апдейтов операционных систем, на компьютер разработчика ПО для разработки апдейтов операционных систем, на сервер дистрибуции апдейтов на операционную систему на компьютер разработчика апдейтов операционных систем, на сборочный сервер апдейтов на операционную систему на компьютер разработчика апдейтов операционных систем, на компьютер разработчика ПО для разработки апдейтов операционных систем для компьютера разработчика ПО для разработки, на …. А ещё там дальше можно по процессорам пройтись - враги в прошивках для процессора, враги на фабрике по выпуску процессоров, враги в карьере по добыче кремния… У-у-у-ух, сколько кругом врагов-то!

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

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

я сейчас скриншот пилю, так что я с вами, за комментами слежу

unclestephen ★★★★★
()

TLS обеспечивается при помощи Let’s Encrypt

ага, спонсоры, повестка, ЦРУ/АНБ/Моссад🤡🤡🤡

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

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

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

смысл не в сертификате - это userspace, сertificate trust chain может читать твое, в MITM, например, тащемта. идея хорошая, работает во все стороны.

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

А какая разница? Тебе шашечки или ехать?

Собирается не сложно, жрать не просит.

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

Если ты боишься митм от анб, оно не страшно для некоторых моделей угроз. По тлс летит уже шифрованый блоб. Ну а клиент держи офлайн, или с сервис воркером разберись, чтобы TOFU запилить для Ad Nihilum

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

Слушай, ты разбираешься. Можешь мне подсказать по одному делу?..

Короче, я в своей васянской цмс, палке ковырялке, — сделал так:

Хэш = sha512( пароль( + с секретной солью) . (sha512(пароль) xor sha512(юзернэйм)))

Поможет ли это хоть немного от Rainbow-таблиц? Идея состояла у меня в том, что если у двух юзеров пароли совпадают, то хэши — всё-равно должны быть разными.

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

Короче, абсолютно все хэши и соли — никому не видны. Но надо знать наверняка: Если взломают хостера, то как долго ждать, что мне «сломают калитку»??? … Может быть, я Неуловимый Джо, и серьёзным взломщикам не нужен, незн.

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

То, что HTML можно сохранять локально это очень хорошо. В таком варианте претензий меньше.

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

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

ниет, внутри tls/ssl - plain, тащемта issuers могут читать твой трафик.
особенно если ты живёшь последним днём и форсишь на все деньги в кии.
в сшп кии обзываются trusted supplied chain? тото они огородились от ZTE, ХУ и тестят локальный ТСПУ на мормонах, кекв.
ну и в рамках напечатанных бумажек ФРС - не сложно организовать псевдо-траст в N-лиц, это всего лишь бумажки(ковид - 10трлн$,изи бризи. наверное поэтому железки дороги - бумажек много).

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

А речь не о сертификате на сайт? Тогда какая разница?

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

Не понел. Дядястёпа уже на выходные ушёл что-ли?

Токены кончились :)

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

ну то есть ты КТ отдаёшь третьей стороне через хранилище/шифрование? что думают ИБ/владельцы по этому поводу?

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

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

  1. подписываешь своим ключем
  2. передаёшь отпечаток некоторым путём собеседникам, они проверяют, что ключ валидный и добавляют исключение.

Гемор, да(

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

Я хотел бы sw, чтобы оно такое делало. Но знаний нет, и времени разобраться тоже.

То, что HTML можно сохранять локально это очень хорошо. В таком варианте претензий меньше.

Да, затеми добавлено: просто сделать и параноикам спокойнее.

серьёзного криптографического приложения.

Я бы не расширял границы использования дальше, чем мои юз-кейсы. А они такого плана: попросить кого-то из родственников прислать мне пароль от их почты; скинуть обратно секрет для TOTP; etc.

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

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

«перед прочтением сжечь»

Шутки шутками, а так и сделано: на сервере всё чистится ещё до расшифровки у клиента.

«Ad Nihilum» © (shazam.com)

Ну норм, кстати. Ещё такое есть: https://www.youtube.com/watch?v=5C7mZxhZ3io

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

Или надо ещё и браузер свой для работы с этим сервером.

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

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

внутри tls/ssl - plain

Мой plain — шифротекст AES256 GCM. См. «обзор протокола»

Вот у этих (https://onetimesecret.com/) ребзь, например, plaintext. Это дикари, ещё и обманщики.

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