Как стать автором
Обновить

Анонимная сеть в 200 строк кода на Go

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров19K
Всего голосов 17: ↑16 и ↓1+19
Комментарии11

Комментарии 11

Линейная нагрузка только обозначена или может быть обойдена?

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

RSA

Ассиметричная криптография сама по себе подтверждена MITM атакам и требует наличия полноценной инфраструктуры PKI (УЦ, CRL и вот это всё). При наличии глобального наблюдателя - анонимность слили в мусор. Наличие УЦ - это точки доверия, а значит анонимность в мусор.

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

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

Кароч, ключевая система - это основа всего, без неё всё эти телодвижения по анонимности бессмысленны.

Линейная сложность

Если честно, не до конца понял, зачем нам полная связность между узлами. При условии посылки сообщений каждый период T подойдёт в принципе любая топология, вопрос только в скорости передачи. Например в кольцевой топологии сообщение должно будет проходить полный круг и уничтожаться отправителем. В топологии типа "звезда" вроде тоже проблем нет, но будет большая нагрузка на центральный узел, т.к. он должен будет рассылать копии всем участникам. А раз можно звезду, то можно и иерархию построить, просто введя дополнительный период Т2 для пересылки межсетевых сообщений.

Период Т

И вот тут мы плавно переходим к третьей проблеме: стабильности работы сети. При наличии одного глобального периода Т возникает проблема доверенного источника времени. Как мы будем синхронизировать часы? Атакующий может создать по серверу времени для каждой пары участников и рассылать им слегка сдвинутые по времени точки начала периода. Тем самым деанонимизируя факты передачи.

Ассиметричная криптография сама по себе подтверждена MITM атакам и требует наличия полноценной инфраструктуры PKI (УЦ, CRL и вот это всё). При наличии глобального наблюдателя - анонимность слили в мусор. Наличие УЦ - это точки доверия, а значит анонимность в мусор.

В статье об этом говорится и о решении тоже:

Необходимо, чтобы все пользователи обменялись своими публичными ключами. Данное обстоятельство также может быть проблемой, потому как публичный ключ может быть подменён извне. Из-за децентрализованного характера сети, не допускается использование центров сертификации (ЦС). Тем не менее, можно воспользоваться N-ым количеством централизованных сервисов явно не связанных между собой для безопасной передачи публичных ключей.

---

Есть всего два вменяемыхсценария распределения ключей - это квантовое распределение ключей (менее надёжно)

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

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

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

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

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

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

Совершенно верно. Полная связность необходима лишь для упрощения самого механизма работы, т.к. это исключает маршрутизацию и, как следствие, дополнительный код. Целью статьи являлось, в первую очередь, создание минимальной анонимной сети. Все дальнейшие совершенствования лишь увеличили бы её количество кода. Так например, в основной моей анонимной сети, которую я пишу в свободное время, как раз неважна топология. Но в любом случае, какую бы мы топологию не выбрали, нагрузка на сеть будет всегда линейна. Если бы мы выбрали топологию "Звезда", то от одной точки к любой другой также бы сообщение доходило и также бы обрабатывалось.

И вот тут мы плавно переходим к третьей проблеме: стабильности работы сети. При наличии одного глобального периода Т возникает проблема доверенного источника времени.

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

Примерно как-то так, надеюсь ответил на все вопросы и замечания.

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

Откуда им взяться в сети с глобальным наблюдателем? Помним, что мы строим сеть в которой есть дядя, который может принудить делать все УЦ всё что угодно. Опять же, это не решает проблемы атаки злоумышленника на сам УЦ и проведение MITM атак. Причём забавно, что чем больше мы этих сервисов добавляем, тем сложнее становится алгоритм консенсуса "а кому из них мы можем доверять". Любой скомпроментированный УЦ автоматически ложит нам вообще всю сеть. Ну такое.

Квантовые технологии лишь укрепят безопасность связи клиент-сервер, но не клиент-клиент.

Ввиду не так чтобы сильной распространённости квантовых технологий, дискуссию предлагаю отложить до времён, когда она будет иметь смысль :)

Как минимум асимметричная криптография защищает от пассивных атак злоумышленника, что нельзя сказать о симметричной криптографии.

Почему нельзя сказазать этого о симметричной? Откуда такой вывод 0_o?

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

Плюсом помимо пассивных атак бывают еще и активные и тут ассиметрия сливает максимально, т.к. векторов для атаки вагон и маленькая тележка.

Факт, только в какой пропорции происходит увеличение вероятности раскрытия информации, сколько потребуется памяти для её осуществления?

Сложно оценить, алгоритмы разные бывают :)

Асимметричные ключи могут жить фактически годами, но да, это не отменяет необходимости их смены/замены.

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

нагрузка на сеть будет всегда линейна.

Мы можем ограничить пользователя, скажем, N связями с другими оконечными узлами. С точки зрения глобального наблюдателя вопрос "пользователь общается с кем-то из N получателей" ничем не отличается от "пользователь общается с кем-то из N+1 получателей" при N > 1. Единственным условием является отправка сообщений на все N узлов сразу. Условно, если в сети 1 млн узлов, а мне нужна связь только с одним из всех этих узлов, при N = 100 я выбираю еще 99 фиксированных узлов на которые буду слать сообщения (эти 99 узлов я выбираю один раз и навсегда).

Да - это сузит область прослушивания для глобального наблюдателя, но это не решит его проблему - он всё также не сможет определить кто из этих 100 получателей мой целевой.

Я не знаток подсчёта сложности, но по интуитивным ощущениям при такой постановке задачи предельная сложность всё равно остаётся линейной, но амортизационная должна вроде как стремиться к константе N.

Откуда им взяться в сети с глобальным наблюдателем?

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

Причём забавно, что чем больше мы этих сервисов добавляем, тем сложнее становится алгоритм консенсуса "а кому из них мы можем доверять". Любой скомпроментированный УЦ автоматически ложит нам вообще всю сеть. Ну такое.

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

> Причем интересно то, что пользователям предлагается обменяться публичными ключами самостоятельно, что на самом эквивалентно обмену симметричными ключами и сводит весь смысл использования ассиметрии к нулю.

>> Не сводит. Как минимум асимметричная криптография защищает от пассивных
атак злоумышленника, что нельзя сказать о симметричной криптографии.

Почему нельзя сказазать этого о симметричной? Откуда такой вывод 0_o?

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

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

Как минимум простота обмена ключами: N(N-1)/2, вместо 2N, и существование идентификатора со связью 1 (публичный ключ) ко многим абонентам, а не 1 (сеансовый ключ) к одному абоненту.

Да - это сузит область прослушивания для глобального наблюдателя, но это не решит его проблему - он всё также не сможет определить кто из этих 100 получателей мой целевой.

Совершенно верно. Подобного же принципа придерживается сеть Herbivore, разделяющая участников сети по группам. Тем не менее у такого принципа есть нюанс в плане того, что децентрализованные сети сами по себе являются динамичными структурами. Если будут существовать в сети статичные узлы, то вероятность того, что пользователь общается именно с ними будет стремиться к нулю. Если общение двух абонентов частое, то из всего множества N=100 можно со временем по крупицам убирать узлы, которых ранее не существовало и оставлять только тех, которые до сих пор активно работают. В таком случае, будет существовать вероятность, при которой N будет стремиться к единице за счёт продолжительной связи между двумя абонентами. Когда же мы в качестве N берём все узлы в системе, такого уже не будет возникать.

Помним, что мы строим сеть в которой есть дядя, который может принудить делать все УЦ всё что угодно.

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

Мы можем ограничить пользователя, скажем, N связями с другими оконечными узлами. С точки зрения глобального наблюдателя вопрос "пользователь общается с кем-то из N получателей" ничем не отличается от "пользователь общается с кем-то из N+1 получателей" при N > 1.

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

Представим что ты общался с братом. КГБ об этом знает, но не знает кто из этих 100 вы.
Теперь вы пишете сообшение любимой маме. И независимо выбираете по 99 новых случайных абонентов, среди которых вероятно общим будет только 100й (мама)

Вот КГБ и раскрыло вашу семейку.

Ассиметричная криптография сама по себе подтверждена MITM атакам и требует наличия полноценной инфраструктуры PKI (УЦ, CRL и вот это всё). При наличии глобального наблюдателя - анонимность слили в мусор.

А если в качестве УЦ использовать блокчейн (в частности криптовалют)?
1)Аня и Борис создают себе криптовалютные кошельки. И кладут туда по доллару.
2)Аня и Боис выбирают не занятые юзернеймы.
3)Аня и Борис создают транзакции(куда угодно) с комментаием: Я юзернейм, мой публичный ключ XXX.
Всё, чтобы Ане связаться с Борисом ей нужно только узнать юзернейм Бориса, далее публичный ключ она считает из блокчейна (самая старая запись с таким юзернеймом).
Да, проблема передачи юзернейма остаётся, но т.к. он человекочитаем, это сделать проще.

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

Мне сложно придумать практическую применимость такого подхода. Обмен информацией между сенсорами, у которых целевой трафик не превышает сотни байт в сутки? Если только.

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

p.s. Но как исследовательская задачка - класс, мне понравилось.

Mobile ID changes - Provides random mobile ID (IMSI) changes, using oblivious authentication during changes. ID changes are on demand. This decouples you as a user from each ID your phone is given, and neither INVISV nor the mobile provider know which ID you received. - $3/change + decoupling principle mpr(multi-party relays)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории