Безопасность приложений - один из важнейших аспектов разработки программного обеспечения.

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

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

Хранение конфиденциальных данных в неправильных местах

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

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

UserDefaults сохраняются просто как файл со списком свойств, который находится в папке Preferences вашего приложения. Они сохраняются в нашем приложении без какого-либо шифрования.

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

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

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

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

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

Правильный способ сделать это

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

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

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

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

Вы также можете хранить такие элементы, как криптографические ключи и сертификаты, которыми вы управляете с помощью Certificate, Key и Trust Services.

API службы связки ключей

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

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

Затем мы добавляем новый пароль в связку ключей, вызывая SecItemAdd с созданным нами запросом.

Получение данных аналогично

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

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

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

Кроме того, существует множество библиотек с открытым исходным кодом, которые упрощают использование Keychain API. Некоторые из них - SAMKeychain и SwiftKeychainWrapper.

Сохранение паролей и выполнение аутентификации

За свою карьеру разработчика iOS я видел одну и ту же ошибку, повторяющуюся снова и снова.

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

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

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

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

Лучше всего хранить пароли и использовать их для запросов входа в систему в качестве хэша, созданного для этого пароля.

Шифрование конфиденциальных данных

Самостоятельная реализация хеширования может быть действительно сложной и излишней, поэтому в этой статье мы воспользуемся помощью библиотеки iOS с открытым исходным кодом CryptoSwift.

CryptoSwift - это постоянно растущая коллекция стандартных и безопасных криптографических алгоритмов, реализованных в Swift.

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

Этот метод принимает учетную запись и пароль и сохраняет хешированную строку в Связке ключей вместо прямой строки.

Разберем, что происходит в этом методе.

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

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

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

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

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

В заключение

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

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

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

Если вам понравилась эта статья, не забудьте аплодировать, чтобы показать свою поддержку.

Следуйте за мной, чтобы просмотреть еще много статей, которые могут вывести ваши навыки разработчика iOS на новый уровень.

Если у вас есть какие-либо вопросы или комментарии, не стесняйтесь оставить заметку здесь или напишите мне по адресу [email protected].