Пользователь
3,2
рейтинг
28 марта 2014 в 00:04

Разработка → TOX: Что произошло в проекте за полгода



Многие наверно уже слышали о Tox — это мессенджер, который должен заменить Skype, предоставив такой же функционал, как и его проприетарный аналог, подарив такие полезные вещи, как: Шифрования всего и вся, отсутствие слежки, отсутствие рекламы, децентрализация.

Может показаться, что проект умер развивается слишком медленно, но на самом деле, у него под капотом (в ядре) произошли огромные изменения которые стоит осветить.

Tox, как большинство ПО, сейчас делится на ядро и оболочку и обычно, ядро разрабатывают одни люди, а оболочку совершенно другие, скорость разработки и внедрение новых функций не всегда одинаковы быстро происходят в обоих частях (Ядро/Оболочка)

В прошлом посте мы тестировали Tox аудиторией хабры (и отправили мой тестовый ID в spam листы).
Но с этого момента произошли изменения, некоторые из которых уже можно «потрогать» а о некоторых только почитать и помочь реализовать в оболочке.

Анонимность


Защита от идентификации способом добавления в друзья

Tox — мессенджер, построенный на основе DHT сети, что означает видимость вас и вашего IP адреса всему миру.
В мире Tox клиенты идентифицируют друг друга на основе ключей генерируемых при первом запуске, очевидно, что была проблема прямой связи ID = IP адрес = физический человек = репрессии.

Для решения этой проблемы применяется луковичная маршрутизация, о которой я упоминал в прошлом посте.
Принцип её работы следующий:
Алиса хочет добавить Боба в друзья для последующего общения.
1) Она выбирает случайных трёх пиров в сети Tox и анонсирует себя по правилам луковичной маршрутизации (Первая нода знает адрес Алисы и ID, вторая нода знает только адрес первой ноды и ID Алисы, третья нода, соответственно знает только ID и IP адрес второй ноды) (Боб при запуске клиента делает так же, выбирая последовательность из трех узлов)

2) Она ищет по DHT ноды которые знают о существовании Боба и передает им сообщение о добавлении в друзья

3) После получения запроса авторизации происходит его передача группе пиров которые знают о бобе, и запрос о авторизации проходит через следующие случайные три ноды выбранные Бобом.

4) После получения авторизации процесс повторяется с использованием новых случайных узлов для передачи подтверждения о добавлении в друзья

5) Устанавливается прямое соединение в котором уже видны IP адреса Боба Алисе и наоборот.

Защита от идентификации за пользователем на основе накопления данных

В сети DHT, обычно (Bittorrent/Kademlia) при первом соединении с сетью, генерируются случайные идентификаторы, которые не меняются при смене IP адреса.
Очевидно, что в рамках безопасного мессенджера — это проблема.

Она решена следующим путём:
1) При первом запуске генерируются ID/Key длительного действия

2) На основе первичных ключей при каждой смене IP адреса генерируются новые ID/Key (так же они меняются через случайные период времени)

Но как Алиса найдет Боба если по старому ключу в DHT она его найти уже не может?

Алиса и Боб друзья, они сгенерировали временные ключи и подсоединились к DHT сети.
Боб находит случайные три узла (A, B, C)
Боб находит ближайший узел который находится ближе всего к нему (D)

Боб создает луковичную маршрутизацию (пакет будет следовать через узлы A, B, C и выходной точкой пакета будет служить нода D)
В место его ключа и ping_id адреса, он анонсирует все нули.
Боб будет продолжать строить цепочку до тех пор, пока он не найдет узел который ближе всего к нему на основе его реального публичного ключа.

Как только такой узел найден, ему будет отправлен запрос с корректными данными ping_id (не своими а любого из узлов A, B, C) — данный узел и будет финальным узлом который будет в дальнейшем анонсировать Боба и отвечать за него в сети выполняя роль ноды D

Боб попросит данный узел держать в памяти информацию о нем для взаимодействия с сетью.

Тем временем Алиса ищет ближайший узел к Бобу, она использует временные ключи и ID, как только она получает ответ в виде ping_id = 0 она отправляет данные данному узлу и просит передать его Бобу, передавая свой временный ID в DHT сети.

Боб находит её в сети, на основе её временного ID, устанавливается прямое соединение.

Таким образом, невозможно узнать IP адрес боба и Алисы пока они не добавлены в друзья друг к другу, так невозможно связать TOX ID и DHT ID (без добавления в друзья) c реальным IP адресом.

PS Естественно на каждом этапе пакеты шифруются и защищены от подделки.

Борьба с админами NAT и фаерволами


Если вы помните, Skype обходит файерволы при помощи супер-нод и использования стандартных портов, TOX тоже будет уметь так делать.
— Работать через 80/443 порт
— Находить супер-ноды или быть ими
— Использовать UDP/TCP в зависимости от окружающей среды

Tox в основном использует UDP (для пробивки NAT), но если настройками безопасности трафик UDP блокируется, то TOX будет делать следующее:

1) Алиса пользуется Tox на соединении которое допускает только TCP подключения, она генерирует временные публичные ключи и подключается к узлам для инициализации.

2) После получения данных о сети с узлов инициализации, она выбирает некоторые количество случайных узлов которые являются супер-нодами

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

4) Боб получает пакет через луковичный роутинг от Алисы, которая сообщает ему, к каким узлам она подключена по DHT с использованием временного публичного ключа.

5) Боб подключается к тем же узлам что и Алиса.

6) Данное соединение используется для передачи как сообщений так и A/V трафика

7) Если какой-либо узел отключается, Боб и Алиса переходят на любой другой узел, к которому они оба подключены.

Супер нода — это такой узел, у которого имеется внешний IP адрес и проброшены порты Tox.

Чему еще научился Tox?


— Ускорена работы DHT сети
— Массовые чаты (Начальная реализация, без шифрования, без синхронизации мета-информации)
— Передача аудио/видео (Полностью реализовано, на стадии аудита)
— Передача файлов
— Поддержка IPV6 (всё протестировано, кроме групповых чатов)

О главном

Всё, что описано выше — реализовано в ядре, а не в оболочке, другими словами — конечные клиенты, пока, не могут пользоваться многими полезными функциями (например передача аудио/видео или файлов) (не все клиенты еще умеют)

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

Кроме того, проект Tox участвует в Google Summer of Code, а это означает, что скоро в проект придут новые разработчики.

О хорошем


— Для Android активно разрабатывается клиент github.com/Astonex/Antox
— Теперь для Windows существует целых 3 клиента
— Теперь для всех (включая Linux) платформ существуют готовые сборки в пакетах wiki.tox.im/binaries
Сможет ли Tox победить Skype?

Проголосовало 1636 человек. Воздержалось 389 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Shift @shifttstas
карма
52,0
рейтинг 3,2
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (72)

  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Напоминаю, что за массовую подписку сеть TOX банить ID
      • +39
        Оу, это несомненно показатель свободы. А где можно ознакомиться с полным списком ограничений?
        • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Как только все механизмы защиты будут стандартизированы — я о них напишу, в любом случае защита от спама должна быть.
          • +1
            Там же защита от спама реализована генерацией случайного ID на конце ключа, это в протоколе стандартизировано.
            Every friend address contains a special 4 byte number called the nospam.

            When a friend request is sent to that user the nospam number must match, or else the friend request is silently discarded. In this way, if you are being spammed with requests, simply change your nospam to a new random number. The attacker must now bruteforce the new nospam number to succesfully attack again. There are 2^(8*4) = 4294967296 possible combinations that they must try before they can successfully send you a new friend request.
      • +1
        Но почему?
    • +31
      А шестизнаков уже совсем не осталось?:)
    • +1
      И мне напишите:
      277333068B9BB473A07C14B9243E58A6C1508EEB5581FF7BC13277FDA24FE81BE421B5CDABF6
  • +4
    А что на счёт безопасной передачи ID?
    В ручную переписывать как то не айс. А отправлять через сеть равносильно всё тем же обычным способам связи с шифрованием, где точно можно сказать кто есть кто.
    • +2
      Я хочу предложить интеграцию с твистером на основе его цепочки блоков, что бы от туда он получал данные (т.е вводить в TOX можно было как ключ так и тупо ник из твистера)
  • 0
    Кстати, я очень, очень давно сталкивался с замечательным (и даже вроде стандартизированным) методом преобразования мнемонически неудобных строк (изначально вроде задумывалось для случайных паролей, но как все понимают можно юзать любые случайные строки) в сраввнительно удобные последовательности из коротких английских слов.

    Длинна предложения во многом зависит от размеров словаря, но даже с стандартным, помню, из MD5-хешей получались вполне приемлимые предложения.

    Можно слегка допилить алгоритм преобразования чтобы слова рифмовались (думаю, ничего очень хитрого в этом нет) и использовать для того чтобы придать идентификаторам человеко-запоминаемый вид (что-то вроде PHONE DICE NONE FOX GONE CAT TONE GLASS BONE COLD ALONE запомнить проще чем что-то вроде приведенного выше идентификатора)

    Пойду поищу «классическую» реализацию…
  • +2
    Пока не будет нормального гуя, ни о какой победе говорить не приходится. Даже учитывая, что Скайп прикладывает к победе альтернативной говорилки максимум усилий.
    • +1
      Подождем Summer of Code. Очень хочется верить в ребят, разрабатывающих Tox, потому что даже конкуренты скайпа вроде ooVoo вызывают рвотный рефлекс имеют неприятный интерфейс, закрытые исходники и набиты кучей рекламы. Хотя, казалось бы, технологии (железо, сеть) уже не первый год позволяют иметь каждому почти бесплатные видеозвонки с нескольким людьми из разных стран… Но вот софт отстает, особенно пригодный не только для гиков.
  • +6
    А есть групповые чаты?
    • +8
      Конечно есть! Что за вопрос?
      • +6
        Спасибо!
        • +17
          Сам себе режиссер...)
        • +1
          Вы «схавали» 5 мин. моего рабочего времени! :)
        • +2
          Приятно беседовать с умным человеком!
  • +3
    Теперь для всех (включая Linux) платформ существуют готовые сборки

    ReactOS, Haiku, KolibriOS, OS/2?
    Из недесктопных: Blackberry, iOS, убунтуфон, MeeGo?

    В списке увидел только парочку юникс-подобных ОС — до всеобъемлющего всех, так ещё и болдом написанного, как-то недотягивает.
    • +1
      Ну… для ReactOS есть ;)
  • 0
    Означают ли все эти манипуляции по защите анонимности, что для начала общения с новым пользователем нужно будет ждать минут пять или дольше? И та же байда при переключении Ethernet/Wi-Fi/4G? Если да, то боюсь массовый пользователь никогда не будет вашим. В Telegram об этом подумали.
    • 0
      Думаю самый долгий этап — это сбор данных о нодах и супер-нодах силами DHT, но по идее это происходит только при первом запуске.
      Отстраивание луковицы — дело быстрое.
    • 0
      Нет, добавление в друзья и доставка сообщений происходят практически моментально.
    • 0
      Добавление в друзья происходит около 4-8 секунд, что очень даже неплохо.
  • 0
    А какой из GUI наиболее функциональный для win?
    Venom, Qt, winTox
    • 0
      Venom
      • 0
        значит не прогадал.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    ммм… Для Windows Phone клиент запилят?:)
  • +8
    Лично мне от IM нужно совсем другое.

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

    Потому что если тебе прислали важную ссылку, когда ты сидел в IM с домашнего компа, и ты не можешь открыть ее на работе — это полный провал.

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

    Раньше эту задачу прекрасно решал Google Talk, которым я пользовался через любимый Jabber/XMPP-клиент (в котором, правда, не было синхронизации хистори из-за частичной проприетарности протокола Talk, но хистори всегда была доступна в облаке, что просто МЕГАудобно). Теперь полуоткрытый Talk превратился в закрытый Hangouts с отвратительнейшим, неюзабельным десктопным клиентом.

    Что остается?

    Skype технически обладает такой возможностью, но реализована она только в клиентах под Windows, iOS и, кажется, Android, а моя основная ОС — Linux.

    В Jabber/XMPP есть два стандарта синхронизации истории. Один мало кем поддерживается и уже заброшен в виду неэффективности. Другой эффективный, но не поддерживается вообще никем, за исключением одного сервера и одного десктопного клиента.

    WhatsApp/Viber/Telegram и подобные — они либо явно заявляют, что хранят историю ограниченное время и удаляют, либо вообще ничего не сообщают о хранении/синхронизации истории. Понятно, что доступа к хистори через вэб-интерфейс, как у Google, нет ни у одного из этих сервисов.

    Особо в этой ситуации удручает фрагментация пользовательской базы.

    PS Военов анонимности прошу не минусовать. Я не выступаю против вашего права шифроваться. Шифруйтесь на здоровье.
    PPS Поставили с товарищем по Tox-клиенту. Ни мне его запрос на добавление не пришел, ни ему мой. Сабж все еще неюзабелен. :(
    • 0
      В последнем клиенте android история только до вчерашнего вечера доступно, что дико раздражает.

      А хранение истории можно реализовать другими способами, как например полная синхронизация между клиентскими устройствами, даже без централизации (но вечное хранение доступно до тех пор пока живо последнее устройство с логом чата)
      А это не для всех приемлемо: поднимать спец ноду с бекапом истории, но есть вариант который рассмотрен около СЦ Диаспора. Можно выбрать ИД друзей которым можно доверить хранить шифрованную персональным ключом историю, в этом случае логика до последней рабочей ноды остается, но данные размазываются по куда большему числу участников, но и трафик увеличивается. Пересылка файлов это torrent + magnet + шифрование (остается только лочить фал до конца полной пересылки, этим бывает грешен скайп, файл отправил, но в ос он не занят и может быть удален)
    • 0
      Что касается доступа к истории Telegram через веб-интерфейс, попробуйте вебограм.
      • +1
        Хвала открытым протоколам!
    • +1
      Вообще, если поддержка мульти-логина будет, то можно «вытягивать» историю из самого себя (правда, одному из клиентов придется быть always online).

      Также, поскольку синхронизация истории не требует расшифровки сообщений («хранителю истории» надо знать лишь ID пользователя, для которого он ее хранит, и таймштампы его сообщений) возможно создание «вспомогательного сервиса» синхронизации историй (равно как и возможность поднять свое собственное хранилово на VPS за $5).
      Преимущество такого подхода будет в том, что:
      «хранение историй у третьих лиц» будет включаться лишь для тех, кому оно надо, при этом не будет оснований для подозрения что де «все равно хранят а мне не говорят»
      если «хранителя истории» я выбираю сам (а то и сам поднимаю на VPS), то я могу выбрать юрисдикцию из соображений своей личной паранойи (АНБ например лично мне почти что и не страшно вовсе)
      • 0
        С одним клиентом всегда в сети, это тоже централизация, она безусловно гораздо более защищена в плане анонимности, но при этом она является точкой отказа с гораздо меньшей надёжностью, чем облако серверов сервиса, помимо этого надо иметь железку, которая всегда в сети, что для пользователя уже не так удобно. Думаю именно об этом говорил lolmaus, имея ввиду факт, что согласен на централизацию, ну т.е. сервис с синхронизацией, и полной доступностью истории «из коробки», т.е. без каких либо телодвижений со стороны пользователя.
        • 0
          Вы меня правильно поняли, спасибо за коммент.
    • –2
      Я пользуюсь хенгаутом и его интерфейс меня полностью устраивает. При этом есть вся история, нет никаких проблем с синхронизацией, а так же, видео и аудио хорошего качества. В общем, рекомендую-таки попробовать попользовать.

      P.S. А то, что они выпилили поддержку XMPP, это, конечно, жесть… Очень плохо.
      • 0
        У меня дикие проблемы с синхронизацией в Хэнгаутс — доходит до того, что на компе приходит сообщение, я слышу звук, а на телефоне никаких новых сообщений нет. Даже если ответить в тот же диалог, то твоё сообщение появится, а предыдущее — не появится, оно останется только на компе.
        • 0
          Ну так оно и не должно приходить на телефон, если ты активен в браузере, так что это не баг, это фитча. Иначе бы меня это сильно раздражало.
          Сообщения у меня синхронизируются настолько быстро, что я бы назвал это «мгновенно». Вся история всегда сразу подгружается и ложится именно туда, куда я ожидаю.
          Откуда у тебя такие проблемы я не знаю.
    • 0
      Эмм. В скайпе такое было и есть под всем платформами.
    • 0
      Есть bitmessage. Децентрализованный мессенджер, который хранит историю сообщений в распределённой сети. История хранится в этой самой сети два дня. Но при этом отправляющая сторона автоматически переотправляет сообщения, если они не дошли, поэтому долго отсутствовавший в сети нод обязательно получит все адресованные ему сообщения. bitmessage только мессенджер, он не поддерживает звонки
      • 0
        Почтовый клиент, если точнее.
  • 0
    Маленькая птичка сообщила, что с этим RFC можно поиграться онлайн: brainwallet.org/#converter

    Итак, для TOX ID A458C89411E87324B0277DAC305E6110C3C0A2817D2B4FF76D55D5A6F81682744836B2B7F948 получаем

    RFC1751:
    A AX GAS GULL TO VERB DIME LOP BY WHOM NEIL OLD BURT FRAY TROY WET GUS HEBE AVOW MILL BEEN LAVA DARN COG FLED JOEL DEE CHAW FEST JUNO

    (30 слов)

    Там еще есть вариант «Poetry», но к сожалению он не рифмует слова, а судя по всему лишь использует популярные «в поэзии» слова в словаре. Его результат для предложенного TOX ID
    glide utter utter secret health rough baby dwell pay grip former silver sheet freedom nation nerd still possible crimson fact won sky nation cousin women broke ponder evil spin home


    тоже 30 слов.

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

    Мне видится возможным «хак», который будет рифмовать слова. shifttstas, если интересно, могу набросать общую концепцию.
    • 0
      Немного поигравшись с очень простой (и понятной простому смертному) питоновой имплементацией конвертера случайных строк в набор слов, понял что «поэтизация» потребует долгой и кропотливой работы, скорее всего с привлечением специалистов по, собственно говоря, поэзии.

      А вот простая конверсия 256 битной случайной строки в «салат из слов» работает вполне нормально.

      В конце концов, наборы слов повышенной запоминаемости (срифмованные или «тематичные») можно получать банальным брутфорсом а-ля Scallion
  • 0
    Обрадовался клиенту для Android, а он при запуске сразу падает :(
    • +2
      Только что собрал себе :)
      работает отлично, успел потестить между десктопом и дроидом.
      Сборка кстати реально в 3 клика.

      Скачать доп либы, импортировать проект в AndroidStudio из VCS Github
      после импорта не нажимать кнопку открыть, а переключиться на скачанный архив и положить фалы по местам, а потом открыть проект и дождаться открытия и нажать build
  • 0
    Кто-нибудь знает, как получить приватный ключ для переноса на другое устройство? И как его перенести? У меня Venom.
  • +1
    Начало статьи очень похоже на описание работы i2p. Отсюда вопрос: нельзя было просто использовать i2p для целей поиска собеседника?
    • 0
      Можно конечно. Просто всех жутко пугает почему-то установка i2p-роутера. А так все эти велосипеды, такие как Tox (да, i2p-messenger без звука\видео, но это временное ограничение вызвано только пропускной способностью сети), Bit-Message и т.п. давно созданы в i2p. Уж лучше б в них вкладывались.
      • 0
        Можно с простеньким роутером, встроенным в программу. На гитхабе есть реализации на c++, правда не ручаюсь за их работоспособность.
        • +1
          Если наконец-то перепишут на C++ то это будет очередная мини-революция т.к скорость работы возрастет
          • 0
            Если бы кто открыл на каком-нибудь Кикстартере такой проект по переписыванию i2p, да ещё и с user-friendly установщиком, я бы внёс свой вклад. И думаю, многие из хабравчан тоже.
            • 0
              Да господи, чем текущей не юзерфрендли? Стандартное «далее-далее-далее» из особенностей только Java поставить если еще не установлена.
              • 0
                «Далее-далее-далее» действительно любая бабушка сделает, но вот после нажатия «Готово» установка не заканчивается и обычно нужно ещё много чего сделать нетривиального.

                Мне вот пришлось искать и прописывать путь для скрипта автонастройки прокси (это что, очень сложно сделать из инсталлятора?) и ручками добавлять записи в адресную книгу (это вообще возвращает нас в эпоху Интернета до изобретения DNS). Не очень-то user friendly, я считаю.
                • +1
                  Единственная базовая настройка — в нужном браузере добавить прокси. Если для этого требуется отдельный инсталятор, то этим людям не чего делать в этой сети. Добавление адреса по сложности нестрашнее работы с торрент-клиентом. Максимум, что необходимо это прочитать гайд с картинками. Если даже в процессе работы с простеньким гайдом коих уже тысячи возникают сложности, то повторюсь этим людям не чего делать в I2P.
                  • 0
                    Ну так а чего мы хотим получить в итоге? Анонимность для всех и каждого или тёплый маленький Интернет-2 «для своих»?

                    Ориентируясь на массовость, нужно рассчитывать на неподготовленного пользователя.

                    Но честно признаться, я тоже скучаю по тем временам, когда интернет был только для тех, кто не боится гайдов! Лучше бы вообще убрать инсталлятор, написать гайд по установке и настройке, да подлиннее и наконец открыть в i2p Хабрахабр, Википедию и всё остальное, что мы так любим. Но к сожалению, это очень маловероятный сценарий.
                    • 0
                      Вы только, что описали CJDNS именно так там сейчас.
  • +1
    Вопрос — как, в контексте луковичной маршрутизации с ее «временными ID», будет работать «отложенная» доставка сообщений (и будет ли)?

    Без временных ID все было бы сравнительно прямолинейно (супер-нода может «законсервировать» несколько сообщений для последующей доставки)…
  • 0
    Как никого в сети не видело месяц назад, так и не видит… Клиент Poison. напишите мне
    • 0
      Тоже не видит, написал
    • 0
      Уже несколько человек написали, только с одним удалось пообщаться…
      • 0
        У поизона есть проблемы, мы когда трестировали, пришли к выводу что лучше всего работает venom
  • 0
    А что вы подразумеваете под словом «супернода»? Если не ошибаюсь, в Tox нет такого понятия.
  • 0
    В свободное время тоже пишу одну распределённую штуку на базе Kademlia-like сети и DHT, и есть мысль, что несколько приложений, каждое из которых поддерживает свою сеть — это страшный оверхед. Было бы лучше, чтобы был единый бэкенд, который бы поддерживал сеть для всех сервисов сразу, сколько бы их не было. Этакая мульти-сеть, объединяющая в себе множество сетей по типу Kademlia. При этом сети будут независимыми, и использование одной программы нельзя будет связать с использованием другой программы. Учитывая, что юзеры сети вполне вероятно могут держать запущенными по несколько приложений одновременно, получилась бы хорошая экономия на пингах и памяти под адресные таблицы. Делается это совсем несложно, просто надо кому-то начать.
    Сейчас же каждый разработчик p2p приложения по новой реализует защиту от флуда и прочих атак, что весьма непростая тема. Было бы хорошо иметь фреймворк, где это всё уже сделано.
    • 0
      Звучит очень интересно, наработки на гитхабе увидить можно?
      • 0
        Я бы и сам не отказался увидеть на гитхабе чего-то подобное и желательно на всех языках программирования. %)
        Если же вы про мой код, то он обязательно там появится, когда (если) начнёт делать хоть что-то.
        • 0
          Да, про него конечно, библиотека для DHT сетей которая довольно просто реализует различные функции — была бы великолепна
          • 0
            tomp2p.net/ на его основе хотел в своё время писать p2p мессенджер

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