Dev Дневник: Създаване на децентрализирана система за заявка за приятели

Сесията (Session) е проектирана така, че първо да бъде поверителност – децентрализирани сървъри, без телефонни номера, цялата партида – но това създава някои проблеми. Как, как позволявате на потребителите да обменят кодиращи ключове и да установят чат „сесия“ (намигване, намигване) възможно най-бързо и гладко?

Първоначално Сесията (Session) беше разклонена на Signal, но имаше възможност да се подобри при някои от присъщи на Signal. Когато използвате Signal или WhatsApp, телефония ви номер се използва за идентификация. Така вашите приятели знаят, че наистина сте вие, когато ви изпращат съобщение.

Когато регистрирате телефонния си номер Signal, качвате няколко пакета с предварително клавиш на сървърите на Signal. След като някой ви добави като приятел, сървърът може да раздаде вашите ключове – дори и да сте офлайн. След това лицето, което ви добавя, може веднага да установи шифрована чат сесия. Използването на телефонни номера и централни сървъри прави обмяната на кодиращи ключове (и комуникация) супер лесна, но компроментира поверителността на потребителите. Например, много лесно е вашият телефонен номер да бъде хакнат, да се смени със сим или да се пренасочи вашия доставчик на друг човек или акаунт.

От Сесията (Session) разработчиците не са искали да правят този компромис – поверителността на потребителите е основна мисия за тях.

Когато централизирани приложения за съобщения като Signal и WhatsAspp събират, съхраняват и разпространяват ключове, когато потребителите получават заявки за приятели, Сесията (Session) използва децентрализирани сървъри – така че трябва да намерим начин да правим това асинхронно.

Мисия: Да се създаде система за „заявка за приятел“, без да се използва телефонни номера, за да се установи сесията на протокол на Signal в асинхронна мрежа.

Системата за заявки на приятели в Signal използва нещо, наречено протокол за обмен на ключове Diffie-Hellman и това прави и Сесията (Session), но са направени няколко модификации.

Протоколът Diffie-Hellman ви позволява да генерирате споделена тайна. Тази споделена тайна е направена чрез последователност от свързани ключове – разпръскване на секритния ключ, тире на секретния ключ на приемащия партньор и окончателно запълване на договорен публичен ключ.

Вижте тази диаграма, за да я разберете по-добре:

  1. Алиса има секретен ключ A, а Боб има секретен ключ Б.
  2. Алис и Боб се съгласяват да използват Public Key C.
  3. Алис смесва A и C (AC) докато Боб смесва B и C (BC).
  4. Те споделят тези резултати помежду си.
  5. След това Алис смесва A с AB (ABC), а Боб смесва B с AC (ABC), така че двамата стигат до крайния ключ.

Забележка: Всеки, който слуша комуникациите, ще вижда C, AC и BC, но без да вижда сам A или B не може да стигне до крайния ключ, ABC.

По-принцип Diffie-Hellman ви позволява да създадете нов секретен ключ заедно. Този метод на криптиране позволява на Алис и Боб да дешифрират и четат своите съобщения лесно , без никой друг да прослушва.

Сигнал (Signal) използва протокола, наречен Extended Triple Diffie-Hellman, в който последователност от тези споделени тайни Diffie-Hellman се генерират и групират – в нещо, наречено „пакет преди ключ“. Хората в разговор могат да използват тези пакети преди ключ, за да се идентифицира взаимно.

Когато използвате Сигнал (Signal), ще генерира голямо количество от тези пакети, които са предварително ключови, и ще ги съхранявате на сървърите на Сигнал (Signal). По този начин, ако някой иска да ви опита и да ви изпрати съобщение, той може незабавно да инициира сесия, защото Сигнал (Signal) може да предостави пакет преди ключ.

Но тъй като Сесията (Session) е децентрализирана, тя няма сървъри за този вид съхранение, което е изключително сложно за да заобиколите. По принцип това означава, че няма начин подателят да знае, че получателят е получил тяхното съобщение, докато не отговори. Установяването на сесия изисква определени примитиви за криптиране, така че трябва да сте сигурни, че и двете страни имат правилните клавиши (и достатъчно от тях!), в противен случай няма да могат да четат съобщенията един на друг.

Когато изпращате заявка за приятелство в Сесията (Session), не просто изпращате един ключ Diffie-Hellman, а четири ключа. С помощта на ефемерни ключове – които еднократно използват публични ключове, предназначени да бъдат изтрити, след това са били използвани – можете да направите предварително ключове, които ви позволяват да продължите да изпращате съобщения, след като Сесията (Session) е започнала.

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

И накрая, можете да изпратите този единствен пакет преди ключовете (този, който управлява всички тях) като заявка за приятел.

Необходимо е да се изпратят още няколко съобщения, преди всички да се съгласят, че Сесията (Session) е започнала, а също и да се съгласят за нейните параметри. За да разберем по-добре това, да се върнем към Алис и Боб.

  1. Алис генерира пакет ключ преди и го изпраща на Боб като заявка за приятел.
  2. Боб генерира собствен пакет преди ключовете и го смесва с този на Алиса, инициира сесия в края на Боб.
  3. След това Боб изпраща празно съобщение обратно до Алиса, като пакетът му е пред ключ и прикрепен на заден план. Забележка: Публичните ключове се изпращат в тази стъпка, но тя все още не криптирана.
  4. Алиса получава ключовете на Боб и ги смесва с тези, които тя му изпрати по-рано, инициира сесията в края на Алиса. Забележка: Алиса знае, че сесията е валидна, ако тя може да дешифрира празното съобщение на Боб.
  5. Алиса потвърждава, че сесията е установена в нейния край, като изпраща празно съобщение до Боб, криптирано като стандартно протоколно съобщение.
  6. След като Боб получава това съобщение, той знае, че сесията е установена.

Тънкостите върху, които екипа от разработчици работи, включваха моделиране на състоянието на обмена в двата края и възможност за плавно възстановяване на всички изгубени съобщения – без да се жертва на UX.

Контраста на това е с протокол на Сигнал (Signal). Когато вашият приятел поиска някого да покани, той е подготвил куп пакети от ключов, които се съхраняват на сървърите на Сигнал (Signal). Така че не е необходимо да се свържете директно с новия приятел – просто трябва да общувате със сървърите на Сигнал (Signal).

Сесията (Session) няма този лукс. Неговият децентрализиран дизайн означава, че не можете да имате готов набор от ключови пакети, готови за стартиране – те трябва да бъдат създадени и изпратени от партньор, за да видите, когато установите чат сесия.

Не беше лесно и екипа на Сесията (Session) се връщаха няколко пъти в продължение на няколко месеца и отне няколко повторения. Екипът на Сесията (Session) продължава да го развива и подобрява.

Това звучи изтощително, но истината е, че решенията на Сесията (Session) стават все по-изгладени и по-добри.

Абонирайте се за нашия бюлетин

За да получавате най-новите корпоративни блокчейн новини.