Как безопасно хранить ключи к картам Mifare в приложении?
У нас есть мобильное приложение на Android, которое считывает защищенные карты Mifare S50, ключ вшит в само приложение. Но если получить доступ к приложению, не составит труда его декомпилировать и вытащить ключи. Вопрос: как можно хранить ключи и пароли, чтобы при декомпиляции хотя бы к ним не было доступа?
У приложения есть пользовали, у пользователей есть карты Mifare, которые вы хотите считывать, ключ для всех карт одинаковый? Или как это работает? Опишите подробнее, я думаю, тут никто ради вас не полезет разбираться, что это за карты и как с ними работать.
Денис Загаевский, ключ для всех карт НЕ одинаковый, ключ генерируется специальным алгоритмом и у каждой карты ключ уникальный. НО, если добраться до исходного кода приложения, то алгоритм генерации ключа становится понятным и не составит труда сгенерировать ключ для любой карты.
Евгений Петров, security through obscurity. Такая себе идея...
Ну ок, значит генерация точно должна быть на сервере, к которому ни у кого нет доступа. Генерируется ключ, отправляется на устройство и там хранится. Поскольку устройство принадлежит держателю карты, это достаточно безопасно.
Денис Загаевский, к сожалению ключ вшивается в саму карту, а чтобы устройство прочитало данные с карты, оно должно знать этот ключ. Хоть ключ и индивидуальный на всех картах, но он базируется на неком алгоритме и получив доступ к алгоритму, получаем доступ ко всем картам. У меня только вариант, ведь устройства наши, отключить любое usb-соединение и какой-либо доступ к настройкам устройства, но это как бы тоже, так себе защитка
Денис Загаевский, в таком случае челик, который приложил карту к устройству должен держать карту у считывателя пока не придет сгенерированный ключ от сервера, а так как устройства работают на симках с 3-4G, неизвестно как долго нужно прикладывать карту (в зависимости от покрытия). А теперь представим, что таких челиков около 10 каждые 2-3 минуты. Но, это я в теории, надо попробовать.
но и до ключа на сервере можно добраться. Декомпилируем приложение, узнаем роуты, узнаем логин/пароль авторизации приложения на сервере и используя эти данные вытаскиваем ключи
Евгений Петров, если так организовать серверную часть - да. Но ваш сервер не должен отдавать куда либо ключи или каким либо образом предоставлять их. Он должен выполнять операции, связанные с шифрованием / дешифрованием.
Берите в пример работу банковского процессинга.
Дмитрий Шицков, но в таком случае, при сливе ключей, становится возможным делать дубли карт. К примеру одна карта привязана к кошельку, злоумышленник декомпилировал ПО, получил ключи для чтения блоков. В блоках хранится зашифрованная инфа, но злоумышленнику не обязательно знать ключ для дешифрования, а просто выгрузить дамп карты и залить на другую карту.
Евгений Петров, не понял. Как злоумышленник получит доступ к ключу, которого нет в приложении, доступном для декомпиляции? Ещё раз - нет способа защитить что-то в приложении, код и ресурсы которого доступны пользователю. Весь код и все чувствительны данные должны храниться и обрабатывать я в безопасной среде, т.е. в sec-зоне
Дмитрий Шицков, если вы работали с картами Mifare, то должны знать, что для чтения защищенного блока (в котором хранится зашифрованное инфо), программа должна "знать" ключ к этому блоку, а ключ можно хранить либо в приложении, либо получать с сервера. И тот и другой способ взламывается/перехватывается на раз-два. Раз есть ключ, то значит есть дамп памяти блока, а значит и дубль карты.
Евгений Петров, к сожалению работал только с Visa и Mastercard, где работа с ключами на клиенте запрещена стандартом pci dss, так как никакими техническими средствами безопасно это не сделать на клиенте. Думаю, аналогичные требования можно предъявить и к вашим картам.