КРИПТОГРАМ/Документация/Как работает
Главная Скриншоты Демо Документация
КАК РАБОТАЕТ

Текущий раздел для тех кому интересно что происходит.

- Мессенджер работает на синтезе симметричного и асимметричного шифрования.
- Данные шифруются на стороне клиента (Ваш браузер) и в таком виде попадают клиенту, которому сообщение адресовано. На стороне адресата (браузер Вашего друга, с которым вы хотите поделиться суперсекретным местом, где продается дико вкусное мороженное) данные расшифровываются.
- Шифрование производится для каждого сообщения отдельно, что минимизирует итак практически равный нулю шанс рассекретить Ваш диалог.
- После доставки каждого сообщения все промежуточные (участвующие в передаче) данные стираются с сервера.
- Чтобы стереть с лица земли Вашу переписку (сообщения, отправленные сквозным типом) достаточно нажать F5.
- Система реализует два способа передачи информации: сквозное и обычное шифрование.
В первом случае сообщения шифруются на клиенте отправителя и способны дешифроваться только на машине получателя. Такие сообщения невозможно расшифровать на сервере, но они хранятся на нем в течении нескольких секунд пока получатель не получит данные. На машинах получателя или отправителя эти сообщения хранятся пока кто-нибудь из них не обновит браузер или система сама не рестартанет в случае долгой неактивности пользователя (5 минут).
Сообщения переданные вторым способом доступны до тех пор пока один из пользователей, участвующих в переписке не удалит их. Такие сообщения передаются и хранятся на сервере в зашифрованном виде, но могут быть прочитанными в случае взлома Вашего сервера злоумышленниками.

ЧАСТЬ I (Теория)

Очень коротко о типах шифрования и почему их применяется два.
Данный продукт использует два типа шифрования - симметричный и асимметричный.

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

Ассиметричный тип:
Ассиметричный тип шифрования более требователен к ресурсам вычислительной составляющей. Помимо нюансов с ресурсами этот тип шифрования еще и не применим к большим объемам передаваемой информации. Нисмотря на недостатки открытие этого метода позволило решить проблемы с передачей ключа. Особенность метода стостоит в том, что сообщение шифруется одним ключем, а расшифровывается другим. Ключ, которым сообщение шифруется могут знать все, кто хочет зашифровать сообщение адресату, а расшифровать сообщение может только адресат, имея второй ключ. Т.е. ключ, которым сообщение при таком медоте было зашифровано уже не применим для обратной операции (операции дешифровки сообщения).
Технически это происходит так: Тот кто хочет, чтобы ему отправили секретное сообщение генерирует с помощью специальной функции два ключа. Один из таких ключей (Публичный) используется для шифрования сообщения. Его могут и должны знать все те, кто хочет что-то передать нашему получателю, но он ничем не может помочь тем кто хочет сообщение расшифровать.. Для этого требуется второй ключ. Он у нашего получателя есть, т.к. его функция, как я уже сказал выше сгенерировала два ключа. Второй ключ (Приватный) служит для декодирования данных. Только им можно расшифровать данные.

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

ЧАСТЬ II (Работа мессенджера)


- ДОБАВЛЕНИЕ НОВОГО ПОЛЬЗОВАТЕЛЯ:

Добавление нового пользователя осуществляется в два этапа.
На первом этапе проверяется наличие в базе пользователя. Этот этап осуществляет js функция addNewUser, которая в случае успеха (отсутствия пользователя) допускает ко второму этапу.
За второй этап отвечает функция addNewUser_2, которая и контролирует добавление.

 


-addNewUser - За проверку на наличие пользователя отвечает js функция addNewUser, которая запускается при клике пользователем на кнопке "Создать" (рисунок выше).
Первым делом, используя библиотеку jsencrypt.js она генерирует пару RSA ключей (Публичный - pubkeyA_2 и Приватный - privkey). Мессенджер просит заполнить два поля: будующий логин и секретное слово, которое является по сути ни чем иным как вторым паролем.
После генерации пары ключей функция забирает из полей введенные пользователем логин и секретное слово, генерирует для текущей передачи данных на сервер уникальный ключ (packet_key). Далее скрипт получает хеш от будущего имени пользователя и от его секретного слова и отправляет данные на сервер файлу addNewUser.php. Перед отправкой на сервер к данным добавляется sid, которое сравнится с текущей сессией на сервере, что обеспечит дополнительную проверку.
На текущем этапе нет никакого шифрования и он необходим только для того, чтобы сервер получил публичный ключ pubkeyA_2 и проверил - есть ли уже такой пользователь в системе.
на сервере скрипт addNewUser.php, получив данные, ищет в базе данных пользователя с указанным хешем от логина. Вместе с этим генерируется симметричный ключ, которым будут расшифровываться данные на последующем этапе. Он записывается в сессионный массив под ключем sync_key_b_2. Вместе с этим генерируется значение iv, которое записывается в сессионный массив под ключем sync_iv_b_2. Оба этих значения будут использоваться для шифровки в javascrypt функцией CryptoJS.AES.encrypt и дешифровки данных php функцией mcrypt_decrypt. Результат об успехе поиска пользователя вместе с полученным из POST packet_key и сгенерированным симметричным ключем шифруются публичным ключем pubkeyA_2 и отправляется назад в js.
Javascrypt, получив ответ от addNewUser.php расшифровывает данные вторым из сгенерированной пары приватным ключем (privkey) с помощью php функции openssl_get_publickey. Из расшифрованных данных извлекается и сравнивается с отправленным в addNewUser.php packet_key. Подобное сравнение будет использоваться при всех последующих обращения на сервер и является дополнительной проверкой, показывающей, что сервер действительно расшифровал наш запрос к ниму.
В случае если пользователь не был найден мессенджер предлагает ввести для будующей учетной записи пароль, открыв соотвествующие поля (поле для пароля и его повтора).

-addNewUser_2 - За добавление нового пользователя отвечает функция addNewUser_2, которая запускается при клике пользователем на кнопке "Регистрация". Эта кнопка открывается пользователю в случае, если не нашлось соответствий хеша от его будущего логина с хешами логинов в базе. addNewUser_2 собирает данныее логина, секретного слова и пароля из полей, получает хеши от секретного поля и пароля. Имя пользователя здесь не хешируется, поскольку оно будет записано в базу именно в этом виде. Так же для текущей передачи генерируется уникальный ключ (packet_key). Для расшифровки данных от сервера генерируется симметричный ключ key_s_s_2. Он так же отправится на сервер вместе с хешем от логина. Перед отправкой на сервер к данным добавляется sid, которое сравнится с текущей сессией на сервере, что обеспечит дополнительную проверку.
Данные шифруются симметричным ключем sync_key_b_2, который сгенерировал серверный скрипт addNewUser.php и который стал известен javascrypt коду после расшифровки данных приватным ключем. Этот симметричный ключ хранится в текущей сессии в массиве _SESSION и им будут расшифрованы данные текущей передачи. Зашифрованные данные отправляются скрипту newUserReg.php, который первым делом сверяет sid с текущей сессией, а потом расшифрует данные симметричным ключем sync_key_b_2, который сгенерировал скрипт addNewUser.php на первом этапе, этапе проверки наличия в системе пользователя. После расшифровки идет повторная проверка на наличие пользователя. Поскольку данные были зашифрованы здесь впервые сервер имеет знание о том как пользователь будет назван в чистом виде. В случае если пользователя нет система добавляет новую запись в таблицу z_users. Ответ, который текущий скрипт вернет браузеру шифруется симметричным ключем key_s_s_2, который был получен после дешифровки данных, отправленных с addNewUser_2. В ответ входит уникальный ключ (packet_key) текущей передачи и переменная state, в которой указано - был ли добавлен пользователь или нет. Функция addNewUser_2 продолжает свою работу, получив эти данные и расшифровав их своим симметричным ключем key_s_s_2, который сгенерировала специально для получения ответа об успехе/неуспехе добавления. Сверяется packet_key текущей передачи, так же полученный после дешифровки данных от newUserReg.php. Если пользователь был добавлен браузер обновится и можно будет залогиниться. Процесс логина производится так же в два этапа.

 


- ПЕРЕДАЧА ДАННЫХ:

Последняя правка от 08.10.2016 18:16
-msgSend - За начало отправки процесса отвечает js функция msgSend, которая запускается при клике пользователем на кнопке "Отправить" (id = msg_send), по нажатию на клавишу Enter или комбинацию Ctrl+Enter.
Первым делом функция проверяет Online ли пользователь, которому мы хотим отправить сообщение.
В зависимости от того в каком положении установлено значение msgs_mas[user_id_act]['crypto_line'] (по клику на значке красного самолетика в диалогах можно переключать способ каким будет отправлено текущее сообщение - сквозным или обычным) скрипт допускает сообщение к отправке или нет. Предположим, пользователь, которому сообщение адресовано онлайн и мы отправляем сообщение сквозным вариантом. Дальнейший текст будет относиться с учетом этой установки.

Скрин от 08.10.2016 18:16 (Рисую)

 


- LONG POLL:

 
while_man 2016