Comments 31
— Если данные используются только в виде хэшей, то эти хэши так или иначе используются. Разреверсить протокол обмена с сервером имея отладчик — несложно. Вешаем брейкпоинт на какие-нибудь сетевые функции (зависит от платформы) и гуляем по стек-трейсу до момента заполнения. Опять же, логирование на этом слое тоже обычно достаточно (даже если используется TLS — можно повеситься отладчиком/логгером до зашифровки).
— Если данные шифруются системными библиотеками — это ничем не помогает, просто опять же гуляем по стек-трейсу и ищем вызовы этих самых библиотек.
— Если данные шифруются в application-space и имена функций не определяются — всё равно можно найти в стеке необходимые функции, хоть и сложнее.
Единственный метод, дающий хоть какую-то надежду — использование статической библиотеки шифрования без каких-либо отладочных наименований (в случае с андроидом — обфускация бинарного байт-кода). Но и это не панацея.
Обфускация, действительно, Не панацея, особенно когда обфусцированный код присутствует >90% времени перед глазами. Его даже не всегда обязательно делать более читабельным :)
А еще учитывая, что сейчас время опенсорса, когда все на виду, и нужно лишь хорошенько потеребить гитхаб
пароль пользователя должен уходить на сервер уже в виде хеша, и проверяться должен хеш, а не исходный пароль
Как в таком случае должен выглядеть обмен данными, если учесть то, что на сервере хранится солёный хеш пароля?
Сервер шлёт соль клиенту; клиент солит/хеширует пароль и отправляет обратно; сервер сравнивает?
Или добавить случайности: сервер генерирует случайное число, и отправляет вместе с солью клиенту; клиент солит/хеширует пароль, затем солит полученным случайным числом и отправляет обратно; сервер солит этим же числом хеш, хранящийся у него, и сравнивает. Так получится обмен, который нельзя проиграть второй раз.
Возник вопрос по первому варианту. Что и с чем сервер будет сравнивать? Если клиент посолит пароль одноразовой солью и захеширует, как сервер поймет, что за хеш ему прислали?
Можете объяснить подробнее или привести пример реализации?
Если там просто деньги и немного — зачем проблемы создавать?
Тиньков и Альфа точно не мешают например. Как и Яндекс.Деньги (их приложение по сути — банковское же).
Единственное — Тиньков любит иногда flash-sms показывать которые не перехватывается стандартными средствами и сразу на экране девайса показываются (что может быть неудобно если пользователю хочется таки редирект, на экран компьютера, есть сервисы) ну и если включена замена push и Тинькова — она включена для одного конкретного устройства (включишь на другом — выключается на прежнем). А вот допустим оплата через NFC работает именно что со всех телефонов у них.
C рутом — Сбербанк при детекте рута не вырубается напрочь а просто оставляет возможность работать только по созданным шаблонам.
Конечно если реально большие деньги на кону — то и подходы из https://habrahabr.ru/post/111232/ вполне могут быть (но вот уж там — явно никакие приложения на телефон ставить не будут, разве что только на просмотр).
С рутом вообще еще та проблема есть что CyanogenMod/Lineage OS в принципе как рут детектится часто, даже когда он там отключен (в смысле приложение НЕ может получить рут, без специального разрешения пользователя). Так же и в некоторых кастомных прошивках.
А допустим для Nexus 5 кастомная прошивка это единственный способ получить андроид с последними обновлениями в том числе и безопасности.
Вообще — в случае с банковским приложением и накрученными защитами — мы защищаем приложение от злого юзера (который и так имеет легальный доступ) или от посторонних приложений которые влезли? Если второе — так достаточно показать один раз предупреждение чтобы юзер был в курсе.
Вообще на Android есть такая штука как SafetyNet (описание со ссылками смотрим на https://koz.io/inside-safetynet/ ) — гугловский детектор одного из трех состояний: все полностью ок, на девайсе… странности… но вероятно угрозы приложению нет, все плохо. Используется куча динамически обновляемых детектов, в процессе на устройство грузится код от гугла.
Обойти при наличии рута саму проверку можно… но пока публично известные публично способы просто подменяют ответ для приложения по сигнатурам.
А вот если сделано идеологически верно, и результаты проверки отсылаются на свой сервер, который проверяет что они верны у гугла то с обходом уже все сильно сложнее.
Бинарные файлы (NSKeyedArchiver).
Штатная защищенность: Отсутствует.
Не совсем корректно. Файл можно создать с атрибутом NSFileProtectionComplete
по ключу NSFileProtectionKey
.
The file is stored in an encrypted format on disk and cannot be read from or written to while the device is locked or booting.
Не стоит, конечно, хранить там какие-то ключи для общения с сервером. Но вполне подходит для хранения временной чувствительной информации, которую нельзя прочесть третьему лицу, если девайс заблокирован.
Все или почти все начинается с личного опыта, так что продолжайте.
Безопасность данных в разработке мобильных приложений