Шифрование пользовательских данных в приложении на базе ОС Android

Научная статья
DOI:
https://doi.org/10.60797/IRJ.2024.145.174
Выпуск: № 7 (145), 2024
Предложена:
10.05.2024
Принята:
05.07.2024
Опубликована:
17.07.2024
11
0
XML
PDF

Аннотация

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

Результатом работы является разработанное приложение мессенджера для операционной системы Android и интеграцией его с облачными сервисами Firebase. Разработка велась с использованием языков программирования Java и Kotlin, в качестве основного криптографического алгоритма был взят алгоритм RSA.

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

1. Введение

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

Огромное подавляющее население планеты имеют и ежедневно пользуются смартфонами под управлением различных операционных систем. По статистике за 2021 год, доля системы Android среди всех занимает долю чуть более 80% на рынке, а системе IOS отводится чуть более 18%.

Приложения под Android

пишутся на двух языках – это Java и Kotlin. Язык программирования Kotlin пришел на замену Java, он работает также на Java Virtual Machine (сокр. JVM), но отличается более активной поддержкой, удобством и мощью. Именно поэтому Java уже устаревает и практически не используется в новых проектах.

Что касается облачного хранилища, то Firebase, наиболее популярное решение для решения множества задач

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

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

В данной работе за основу шифрования данных был взят асимметричный алгоритм RSA

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

2. Обзор

Согласно исследованию 2019 года компании BI.ZONE

по разновидностям уязвимостей на мобильных приложениях, 28% приходится на хранение данных, 21% приходится на аутентификацию и управление сессиями, 16% на серверную часть, 11% на взаимодействие с платформой, 8% на сетевое взаимодействие и 16% на другое.

Таким образом основными слабыми местами на мобильных устройствах является хранение данных и токенов авторизации.

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

В статье по основным способам шифрования на мобильных устройствах

приводятся следующие принципы касаемо защиты данных:

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

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

3. Шифрование сообщений для защиты переписки между пользователями.

4. Шифрование VPN с целью защиты интернет-соединения.

Если говорить о применении алгоритмов шифрования на мобильных устройствах, то в статье

описан процесс разработки кроссплатформенного приложения для обмена данным с информационной системой.

Однако, автором была выбрана не лучшая технология для разработки мобильного приложения, а именно Xamarin от компании Microsoft. Как описывает и сам автор, недостатками данного решения является: недостаточная поддержка данного продукта со стороны компании, ограниченный выбор сторонних библиотек, ограниченная функциональность данного решения, что ставит под вопрос дальнейшее развитие и поддержку разрабатываемого мобильного приложения.

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

Дополнительно хотелось бы отметить то, что автор не привел реализацию защиты данных в разрабатываемом решении.

3. Актуальность и постановка целей и задач

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

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

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

С учетом используемых технологий данный алгоритм будет модифицирован для возможности использования его с облачным хранилищем Firebase. А также будет представлена реализация на языке программирования Kotlin.

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

4. Основные результаты

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

Исходя из этого, данные будут поделены на 3 корневых файла:

1) Chats – в котором будет храниться информация об уникальном чате между пользователями;

2) Messages – в котором будут храниться все сообщения пользователей;

3) Users – в котором будут храниться данные для авторизации пользователей.

Далее необходимо определить, какого рода информацию необходимо хранить в облаке. Пойдем по порядку, файл Users будет содержать информацию о зарегистрированных пользователях. Описание полей для хранения информации в файле Users представлено в таблице 1.

Таблица 1 - Описание полей для файла Users

Название

Тип данных

Обозначение

Пример

Примечание

userId

Int

Уникальный идентификатор пользователя

14234

​-

password

String

Пароль, которым пользователь будет защищать свой аккаунт

35328570236275443623

Хранится в виде хэш-функции

username

String

Логин или имя пользователя, по которому он будет авторизовываться и по которому другие пользователи смогут его найти

Иван

​-

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

Визуальная структура пакетов файла Users представлена на рисунке 1.

Структура данных файла Users

Рисунок 1 - Структура данных файла Users

Далее перейдем к файлу Chats, который будет содержать в себе информацию с кем определенный пользователь ведет общение.

Внутри файла Chats будут файлы с именами пользователей, внутри них будут содержаться файлы с именами пользователей, с которыми данный человек ведет переписку. Ниже, в таблице 2 описаны поля, которые будут содержаться в данном файле.

Таблица 2 - Описание полей для файла Chats

Название

Тип данных

Обозначение

Пример

Примечание

chatId

Int

Уникальный id чата, по которому можно будет найти переписку

14234

-

lastMessage

String

Последнее сообщение

3532857|0236275|443623

Хранится в зашифрованном виде

lineKeys

String

Ключи, используемые для шифрования

353257236|357925|239755

Хранится в зашифрованном виде

timeMessage

String

Время, в которое было отправлено сообщение

3462753|32956236|312657

Хранится в зашифрованном виде

usernameToWhom

String

Имя пользователя, с которым ведется общение

Имя

-

Визуальная структура пакетов файла Chats представлена на рисунке 2.

Структура данных файла Chats

Рисунок 2 - Структура данных файла Chats

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

Таблица 3 - Описание полей для файла Messages

Название

Тип данных

Обозначение

Пример

Примечание

timeMessage

String

Время, в которое было написано сообщение

5235223|2368352|1485635

Хранится в зашифрованном виде

message

String

Сообщение

3532857|0236275|443623

Хранится в зашифрованном виде

urlImage

String/null

Ссылка на изображение, если оно есть

353257236|357925|239755

Хранится в зашифрованном виде

usernameFrom

String

Кто написал это сообщение

3462753|32956236|312657

Хранится в зашифрованном виде

Визуальная структура пакетов файла Messages представлена на рисунке 3.

Структура данных файла Messages

Рисунок 3 - Структура данных файла Messages

Теперь разберем, как работает сам алгоритм создания ключей на базе криптографического алгоритма RSA.

Большинство криптографических алгоритмов строятся по принципу «В одну сторону легко, в другую - невероятно сложно»

,
,
. Для примера возьмем выражение (1), где произведение двух чисел 21489237 и 903285327 образуют число 19410912470626499.

img
(1)

Зная результат выражения 19410912470626499, нам будет очень сложно подобрать числа 21489237 и 903285327.

Теперь перейдем к математической стороне создания открытого и закрытого ключа. Алгоритм следующий:

1) выбираем 2 больших простых числа p и q;

2) вычисляем n как произведение p и q в соответствии с формулой (2);

img
(2)

3) после, вычисляем функцию Эйлера φ(n) согласно формуле (3);

img
(3)

4) затем выбираем произвольное простое число e в диапазоне: 0 < e < n. Пара чисел (e, n) будет открытым ключом;

5) вычисляем целое число d из соотношения по формуле (4). Пара чисел (d, n) будет закрытым ключом.

img
(4)

Шифрование сообщения происходит посимвольно по формуле (5). Для этого используем пару (e, n) открытого ключа:

img
(5)

Чтобы расшифровать или восстановить сообщение, используем пару (d, n) закрытого ключа в соответствии с формулой (6):

img
(6)

где: T – код символа; C – закодированный код символа.

Реализация криптографического алгоритма на языке программирования

Kotlin представлена на рисунках 4 – 5.

Метод для формирования публичного и приватного ключа

Рисунок 4 - Метод для формирования публичного и приватного ключа

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

Рисунок 5 - Вспомогательные методы для формирования публичных и приватных ключей

Теперь перейдем к формированию ключей шифрования для пароля. В основе будет лежать описанный выше криптографический алгоритм RSA. Как мы помним, для начала формируются 2 больших простых числа p и q, а после формируем число e.

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

Алгоритм формирования семени для нахождения большого простого числа p:

1) получаем id и username пользователя;

2) умножаем строку username саму на себя 8 раз и прибавляем к получившейся строке id;

3) умножаем строку «FNJ#J!N2*SFN#N» саму на себя 6 раз;

4) находим сумму кодов всех символов в обеих строках;

5) затем преобразуем данное число в BigInteger с количеством бит равным 512;

6) проверяем, является ли данное число простым, если да, то число p найдено, в противном случае прибавляем 1 и повторяем условие в шаге №6.

Реализация нахождения большого простого числа p на языке Kotlin представлена на рисунке 6.

Нахождение большого простого числа p

Рисунок 6 - Нахождение большого простого числа p

Алгоритм формирования семени для нахождения большого простого числа q:

1) получаем id и username пользователя;

2) умножаем строку username саму на себя 24 раза и прибавляем к получившейся строке id;

3) умножаем строку «=BSFUIA(#)$)(%@#DJNJ» саму на себя 7 раз;

4) находим сумму кодов всех символов в обеих строках;

5) затем преобразуем данное число в BigInteger с количеством бит равным 512;

6) проверяем, является ли данное число простым, если да, то число q найдено, в противном случае прибавляем 1 и повторяем шаг №6.

Реализация нахождения большого простого числа q на языке Kotlin представлена на рисунке 7.

Нахождение большого простого числа q

Рисунок 7 - Нахождение большого простого числа q

Алгоритм формирования семени для нахождения большого простого числа e:

1) получаем id и username пользователя;

2) умножаем строку username саму на себя 36 раз, прибавляем к получившейся строке id и массив байт значения φ(n);

3) умножаем строку «UH6WFUNX_$@XRMJ#@» саму на себя 3 раза;

4) находим сумму кодов всех символов в обеих строках;

5) затем преобразуем данное число в BigInteger с количеством бит равным 512;

6) проверяем, является ли данное число простым и попадает в диапазон 0 < e < n, если да, то число e найдено, в противном случае прибавляем 1 и повторяем условие в шаге №6.

Реализация нахождения большого простого числа e на языке Kotlin представлена на рисунке 8.

Нахождение большого простого числа e

Рисунок 8 - Нахождение большого простого числа e

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

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

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

Экран авторизации и регистрации

Рисунок 9 - Экран авторизации и регистрации

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

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

Основной экран со списком чатов

Рисунок 10 - Основной экран со списком чатов

При клике на элемент списка происходит переход на экран общения с данным пользователем. На данном экране есть возможность просматривать всю историю сообщений, писать и отправлять сообщение своему собеседнику, а также возможность отправлять изображения. Внешний вид экрана для общения пользователей представлен на рисунке 11.
Экран для общения двух пользователей

Рисунок 11 - Экран для общения двух пользователей

И последний экран, который упоминался ранее, — это поиск других пользователей. Задумка проста: если пользователь хочет начать с кем-то общение, он его находит через поиск, а дальше начинает общение. При клике на элемент списка открывается экран чата с этим пользователем. Интерфейс поиска среди пользователей представлен на рисунке 12.
Экран поиска других пользователей

Рисунок 12 - Экран поиска других пользователей

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

5. Заключение

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

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

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

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

Метрика статьи

Просмотров:11
Скачиваний:0
Просмотры
Всего:
Просмотров:11