Incognito Private Messenger — первый в мире мессенджер без идентификации

ДНЕПР, УКРАИНА

Нью-Йорк, США

WhatsApp, Telegram, Skype

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

 

В этом кейсе мы расскажем, как создали мессенджер первый в мире для переписки, который позволяет общаться без сканирования телефонной книги и списка номеров, — Incognito Private Messenger.

Платформы:

iOS, Android

Устройства:

Телефон

Языковые версии:

Русская

Средняя оценка:

Google Play

Предыстория

 

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

 

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

 

Задача

 

Создать мессенджер без идентификации пользователя для iOS и Android.

 

Пожелания:

создание мессенджера

 

Функциональные особенности

 

Решение

Для создания приложения с такими функциональными особенностями следовало решить несколько задач:

 

Чтобы решить эти задачи, мы использовали современный стек технологий.

 

Дизайн

 

На первом этапе мы разработали две концепции дизайна: светлый и темный. Решили остановиться на темном, так как именно такой дизайн у пользователя ассоциируется с приватностью.  Для иконки тоже взяли привычный пользователям образ — некто в шляпе. Образ человека в шляпе раскрыли с помощью ярких оттенков.

Кликабельные элементы не должны  сливаться с основным темным цветом приложения, поэтому для них выбрали яркие, в меру контрастные цвета.

 



 

Подчеркиваем приватность

 

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

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

 



 

Разработали оповещение на iOS о том, что второй участник чата сделал скриншот переписки. В версии для Андроид пользователь может полностью отключить возможность делать скриншоты в приложении.

 



 

При необходимости вся переписка удаляется одним нажатием кнопки. На вход в приложение можно установить пароль.

 

создание мессенджера на андроид

 

Как все работает изнутри

Приватность

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

 



 

Механизм такой: пользователь А создает чат, дает ему название и приглашает в чат пользователей В и С. Пользователи В и С могут войти в чат тремя способами:

 

 

Количество пользователей в одном чате  не ограничено.

 



 

Шифрование

 

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


В этом алгоритме передача данных основана на принципе end-2-end шифрования. Это самый безопасный протокол, в котором шифровка и расшифровка сообщений происходят без участия сервера. Сервер служит лишь инструментом передачи уже зашифрованных сообщений. Среднее время обработки одного сообщения измеряется в миллисекундах и стремится к нулю. Сервер хранит только лишь зашифрованные сообщения, которые не доставлены  адресату (например, при отсутствии подключения к интернету) и автоматически удаляет их через 7 дней, если получатель так и не появился в сети. Расшифровать информацию может только получатель с помощью закрытого ключа. Таким образом, на серверах не остается никаких следов.

 

Архитектура, стек технологий

 

Для разработки back-end мы выбрали платформу NodeJS. По нашему мнению, эта платформа лучше всего подходит для  реализации чатов с использованием сокетов. Платформа легко и быстро масштабируется. С коробки есть поддержка 10 тысяч подключений на одной ноде. Количество подключений можно увеличить до 100 тысяч. Для этого достаточно изменить настройки.

Для быстрой работы с данными чатов и удобного трансфера  данных нам нужна NoSQL БД (хранение зашифрованных данных до момента доставки получателю) . Большинство компаний для этой цели используют MongoDB. Но для нашей цели это решение не подходило — в MongoDB есть ряд проблем с очисткой файлов после удаления записей, а также с масштабированием.

Поэтому в качестве базы данных мы выбрали RethinkDB. У этой базы данных нет таких проблем и есть удобный синтаксис для работы с выборкой RQL (Resource Query Language).

 

Android

 

Приложение для Android написано на Kotlin и соответствует последним рекомендациям  Google. Мессенджер мы создали на основе шаблона проектирования архитектуры  MvVM с использованием Android Architecture Components. Этот шаблон позволяет создать гибкую архитектуру. Поэтому в будущем мы без проблем сможем расширить функционал приложения.

 

iOS

 

Для создания приложения для iOS мы использовали наш Scaffold на базе MvVM шаблона проектирования. В будущем можно будет расширить функционал приложения.

 

создание чата

 

Приложение Incognito Private Messenger обеспечивает 100% конфиденциальность

 

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

 

Уникальное решение

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

 


Заключение

Incognito Private Messenger  — уникальный в своем роде. Дальше, по мере необходимости и  по мере роста числа пользователей, мы будем расширять функционал приложения. Все возможности для этого мы предусмотрели.

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

 

Расчет проекта

Что будем делать? Каждая мелочь и мысль может помочь нам составить необходимое представление о проекте

  • United States+1
  • United Kingdom+44
  • Afghanistan (‫افغانستان‬‎)+93
  • Albania (Shqipëri)+355
  • Algeria (‫الجزائر‬‎)+213
  • American Samoa+1
  • Andorra+376
  • Angola+244
  • Anguilla+1
  • Antigua and Barbuda+1
  • Argentina+54
  • Armenia (Հայաստան)+374
  • Aruba+297
  • Australia+61
  • Austria (Österreich)+43
  • Azerbaijan (Azərbaycan)+994
  • Bahamas+1
  • Bahrain (‫البحرين‬‎)+973
  • Bangladesh (বাংলাদেশ)+880
  • Barbados+1
  • Belarus (Беларусь)+375
  • Belgium (België)+32
  • Belize+501
  • Benin (Bénin)+229
  • Bermuda+1
  • Bhutan (འབྲུག)+975
  • Bolivia+591
  • Bosnia and Herzegovina (Босна и Херцеговина)+387
  • Botswana+267
  • Brazil (Brasil)+55
  • British Indian Ocean Territory+246
  • British Virgin Islands+1
  • Brunei+673
  • Bulgaria (България)+359
  • Burkina Faso+226
  • Burundi (Uburundi)+257
  • Cambodia (កម្ពុជា)+855
  • Cameroon (Cameroun)+237
  • Canada+1
  • Cape Verde (Kabu Verdi)+238
  • Caribbean Netherlands+599
  • Cayman Islands+1
  • Central African Republic (République centrafricaine)+236
  • Chad (Tchad)+235
  • Chile+56
  • China (中国)+86
  • Christmas Island+61
  • Cocos (Keeling) Islands+61
  • Colombia+57
  • Comoros (‫جزر القمر‬‎)+269
  • Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)+243
  • Congo (Republic) (Congo-Brazzaville)+242
  • Cook Islands+682
  • Costa Rica+506
  • Côte d’Ivoire+225
  • Croatia (Hrvatska)+385
  • Cuba+53
  • Curaçao+599
  • Cyprus (Κύπρος)+357
  • Czech Republic (Česká republika)+420
  • Denmark (Danmark)+45
  • Djibouti+253
  • Dominica+1
  • Dominican Republic (República Dominicana)+1
  • Ecuador+593
  • Egypt (‫مصر‬‎)+20
  • El Salvador+503
  • Equatorial Guinea (Guinea Ecuatorial)+240
  • Eritrea+291
  • Estonia (Eesti)+372
  • Ethiopia+251
  • Falkland Islands (Islas Malvinas)+500
  • Faroe Islands (Føroyar)+298
  • Fiji+679
  • Finland (Suomi)+358
  • France+33
  • French Guiana (Guyane française)+594
  • French Polynesia (Polynésie française)+689
  • Gabon+241
  • Gambia+220
  • Georgia (საქართველო)+995
  • Germany (Deutschland)+49
  • Ghana (Gaana)+233
  • Gibraltar+350
  • Greece (Ελλάδα)+30
  • Greenland (Kalaallit Nunaat)+299
  • Grenada+1
  • Guadeloupe+590
  • Guam+1
  • Guatemala+502
  • Guernsey+44
  • Guinea (Guinée)+224
  • Guinea-Bissau (Guiné Bissau)+245
  • Guyana+592
  • Haiti+509
  • Honduras+504
  • Hong Kong (香港)+852
  • Hungary (Magyarország)+36
  • Iceland (Ísland)+354
  • India (भारत)+91
  • Indonesia+62
  • Iran (‫ایران‬‎)+98
  • Iraq (‫العراق‬‎)+964
  • Ireland+353
  • Isle of Man+44
  • Israel (‫ישראל‬‎)+972
  • Italy (Italia)+39
  • Jamaica+1
  • Japan (日本)+81
  • Jersey+44
  • Jordan (‫الأردن‬‎)+962
  • Kazakhstan (Казахстан)+7
  • Kenya+254
  • Kiribati+686
  • Kosovo+383
  • Kuwait (‫الكويت‬‎)+965
  • Kyrgyzstan (Кыргызстан)+996
  • Laos (ລາວ)+856
  • Latvia (Latvija)+371
  • Lebanon (‫لبنان‬‎)+961
  • Lesotho+266
  • Liberia+231
  • Libya (‫ليبيا‬‎)+218
  • Liechtenstein+423
  • Lithuania (Lietuva)+370
  • Luxembourg+352
  • Macau (澳門)+853
  • Macedonia (FYROM) (Македонија)+389
  • Madagascar (Madagasikara)+261
  • Malawi+265
  • Malaysia+60
  • Maldives+960
  • Mali+223
  • Malta+356
  • Marshall Islands+692
  • Martinique+596
  • Mauritania (‫موريتانيا‬‎)+222
  • Mauritius (Moris)+230
  • Mayotte+262
  • Mexico (México)+52
  • Micronesia+691
  • Moldova (Republica Moldova)+373
  • Monaco+377
  • Mongolia (Монгол)+976
  • Montenegro (Crna Gora)+382
  • Montserrat+1
  • Morocco (‫المغرب‬‎)+212
  • Mozambique (Moçambique)+258
  • Myanmar (Burma) (မြန်မာ)+95
  • Namibia (Namibië)+264
  • Nauru+674
  • Nepal (नेपाल)+977
  • Netherlands (Nederland)+31
  • New Caledonia (Nouvelle-Calédonie)+687
  • New Zealand+64
  • Nicaragua+505
  • Niger (Nijar)+227
  • Nigeria+234
  • Niue+683
  • Norfolk Island+672
  • North Korea (조선 민주주의 인민 공화국)+850
  • Northern Mariana Islands+1
  • Norway (Norge)+47
  • Oman (‫عُمان‬‎)+968
  • Pakistan (‫پاکستان‬‎)+92
  • Palau+680
  • Palestine (‫فلسطين‬‎)+970
  • Panama (Panamá)+507
  • Papua New Guinea+675
  • Paraguay+595
  • Peru (Perú)+51
  • Philippines+63
  • Poland (Polska)+48
  • Portugal+351
  • Puerto Rico+1
  • Qatar (‫قطر‬‎)+974
  • Réunion (La Réunion)+262
  • Romania (România)+40
  • Russia (Россия)+7
  • Rwanda+250
  • Saint Barthélemy+590
  • Saint Helena+290
  • Saint Kitts and Nevis+1
  • Saint Lucia+1
  • Saint Martin (Saint-Martin (partie française))+590
  • Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)+508
  • Saint Vincent and the Grenadines+1
  • Samoa+685
  • San Marino+378
  • São Tomé and Príncipe (São Tomé e Príncipe)+239
  • Saudi Arabia (‫المملكة العربية السعودية‬‎)+966
  • Senegal (Sénégal)+221
  • Serbia (Србија)+381
  • Seychelles+248
  • Sierra Leone+232
  • Singapore+65
  • Sint Maarten+1
  • Slovakia (Slovensko)+421
  • Slovenia (Slovenija)+386
  • Solomon Islands+677
  • Somalia (Soomaaliya)+252
  • South Africa+27
  • South Korea (대한민국)+82
  • South Sudan (‫جنوب السودان‬‎)+211
  • Spain (España)+34
  • Sri Lanka (ශ්‍රී ලංකාව)+94
  • Sudan (‫السودان‬‎)+249
  • Suriname+597
  • Svalbard and Jan Mayen+47
  • Swaziland+268
  • Sweden (Sverige)+46
  • Switzerland (Schweiz)+41
  • Syria (‫سوريا‬‎)+963
  • Taiwan (台灣)+886
  • Tajikistan+992
  • Tanzania+255
  • Thailand (ไทย)+66
  • Timor-Leste+670
  • Togo+228
  • Tokelau+690
  • Tonga+676
  • Trinidad and Tobago+1
  • Tunisia (‫تونس‬‎)+216
  • Turkey (Türkiye)+90
  • Turkmenistan+993
  • Turks and Caicos Islands+1
  • Tuvalu+688
  • U.S. Virgin Islands+1
  • Uganda+256
  • Ukraine (Україна)+380
  • United Arab Emirates (‫الإمارات العربية المتحدة‬‎)+971
  • United Kingdom+44
  • United States+1
  • Uruguay+598
  • Uzbekistan (Oʻzbekiston)+998
  • Vanuatu+678
  • Vatican City (Città del Vaticano)+39
  • Venezuela+58
  • Vietnam (Việt Nam)+84
  • Wallis and Futuna (Wallis-et-Futuna)+681
  • Western Sahara (‫الصحراء الغربية‬‎)+212
  • Yemen (‫اليمن‬‎)+967
  • Zambia+260
  • Zimbabwe+263
  • Åland Islands+358