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

Cypher десктопное приложение, написанное на основе платформы node-webkit

Время на прочтение4 мин
Количество просмотров9.1K
В статье пойдет речь о десктопном приложении, написанном на основе платформы node-webkit. На Хабре были статьи которые описывают саму платформу: раз, два, три. Но реальных приложений которые используют эту платформу не так много. В начале я раскажу о приложении, о его задачах и функционале, дальше я перейду к техническим возможностям платформы node-webkit, которые были использованы в приложении. Статья не изобилует вставками кода, весь код выложен на github. В конце статьи будут ссылки на все использованные источники информации.

Моей целью было создание полноценного приложения с использованием платформы node-webkit. Задача приложения — защита онлайн переписки, осуществляемой через мессенджеры (Skype, Google Talk, еtc.) Посылая по открытым каналам уже зашифрованную информацию, вы усложняете процесс получения доступа к данным третьей стороной. Существует множество способов зашифровать сообщение, но проблема в том, что ключ для шифрования нужно сообщить вашему собеседнику. Допустим, ваш канал прослушивают, и имеют доступ ко всему, что вы отправляете и получаете. Для решения этой задачи приложение использует алгоритм Дэффи-Хеллмана. Про этот алгоритм уже расказывали на Хабре, вот ссылка. Но больше всего впечатляет видео, которое наглядно описывает, как работает алгоритм — YouTube. Более подробно об этом алгоритме можно почитать в Википедии.



И так процесс можно разделить на две части. Первая — это создание общего секретного ключа, и собественно шифрование информации. Создание секретного ключа для обоих партнеров состоит из четырех последовательных шагов. Весь процесс построен с минимальным участием пользователя, чтобы секретный ключ случайным образом не получился а-ля «12345678» или «password».
Первый шаг — это создание приватного ключа; для уменьшения вероятности прочтения его через скриншот экрана или прослушивания событий клавиатуры, все ключи генерирует скрипт и форма закрыта от глаз пользователя. Второй шаг — это создание публичного ключа, который необходимо будет отослать своему партнеру по переписке.



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



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



Не много технических деталей.

Для создания визаульного представления я использовал web-фреймворк BootMetro. По сути это Bootstrap, оформленный под стиль Metro от Windows. Думаю, для десктопного приложения этот стиль здесь как раз к месту.

Чтобы сделать интерфейс более дружественным к пользователю и облегчить процесс копирования сложного ключа из полей формы, приложение использует предоставляемый платформой node-webkit объект clipboard. Этот объект работает кросплатформенно (проверял на Ubuntu Linux 12 и Windows 7), но пока поддерживает только один тип данных — text.

Теперь к более сложному. Алгоритм Дэффи-Хеллмана составлен таким образом, что чем большее число испозльзуется для создания публичного ключа, тем меньше вероятность его расшифровки третьей стороной за разумное время. На этапе реализации алгоритма я столкнулся с проблемой, что математические операции с большими числами JavaSсript не поддерживает. Поиск в гугле привел меня к библиотеке jsbn автора Tom Wu. Автор утверждает, что API его библиотеки работает по тому же принципу, что и API java.math.BigInteger в Java. Библиотека не только предоставила возможность совершать математические операции над целыми числами блольшой размерности, но также имела в своем составе работающие примеры реализации алгоритма Дэффи-Хэллмана и RSA шифрования. Протестировав примеры, сделал выбор: использовать jsbn для создания секретного ключа.

Одной из ключевых возможностей платформы node-webkit является использование модулей node.js. Для того, чтобы использовать эту возможность, я решил для шифрования информации прмиенить модуль crypto, а именно два класса: Cipher и Dechiper. В интернете достаточно документации и живых примеров кода, так что их не привожу. Объект Cipher поддерживает различные алгоритмы шифрования, список зависит от установленого OpenSSL. Например, это может быть 'aes192', 'blowfish' и т.д. Зашифрованная инофмация может выводиться в виде 'binary', 'base64' или 'hex'. В представленном приложении используется алгоритм 'des-ede3-cbc', а вывод информации осуществляется в виде 'hex'. Так что, если есть желание, вы можете пересобрать для себя приложение из исходников, используя тот метод, который вам ближе. Для этого вам понадобится скачать и установить платформу node-webkit. В документации доступно описывается процесс сборки и упаковки приложений из исходников. Проблем же с использованием модуля node.js в коде вобще не возникало. Спасибо разработчкикам платформы node-webkit за предоставленную возможность использовать серверный и клиентский JavaScript в одном потоке.

Плюсы приложения

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

Минусы приложения

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

Возможные сферы применения: передача важной информации по открытым каналам (ключи, пароли, или описание местности, где клад закопан).

Тестирование приложения проводилось в среде операционных систем Linux Ubuntu 12 и Windows 7. Для полноценного тестирования приложения вам понадобятся два участника, если же у вас нет такой возможности, тогда, при формировании секретного ключа, вместо публичного ключа вашего партнера, вставьте свой же публичный ключ.

Сcылка на приложение

Linux
Windows

Источники информации:

Репозиторий GitHub Repo
Страница проэкта на GitHub Page
Проэкт node-webkit
Алгоритм Дэффи-Хэллманна в Википедии
Видео на YouTube
Библиотека jsbn
Web фреймворк BootMetro
Теги:
Хабы:
+13
Комментарии11

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн