Какой самый безопасный способ включить пару ключей (открытый / закрытый) в apk - PullRequest
7 голосов
/ 07 февраля 2012

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

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

есть идеи?Спасибо

Ответы [ 2 ]

4 голосов
/ 07 февраля 2012

Сохраните пару ключей в хранилище ключей и включите хранилище ключей в качестве ресурса в ваш APK.Android предпочитает формат BouncyCastle Key Store (BKS) .Хранилища ключей специально предназначены для этой цели.

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

Однако,вам, возможно, не нужно делать это в любом случае.Если ваша цель - защитить / зашифровать данные, передаваемые на сервер или с сервера, используйте SSL / TLS.Если вы не выполняете аутентификацию на стороне клиента, вашему серверу требуется сертификат SSL, а вашему клиенту - нет;протокол обеспечивает безопасное создание ключей шифрования для вас.Если вы хотите, чтобы сервер аутентифицировал клиента (сделайте так, чтобы ваш сервер общался только с вашими клиентами), вам необходимо установить SSL-сертификат на стороне клиента вместе с вашим приложением ... это закрытый ключ, который вы используете.наверное думаю о.

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

2 голосов
/ 07 февраля 2012

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

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

Если ваши требования состоят в обеспечении аутентификации клиента на сервере с использованием общедоступного / частногоКлючи, тогда все становится более сложным, потому что если вы поместите ключ в apk, независимо от того, сколько вы его запутываете (включая встраивание его в нативную библиотеку), он только замедлит выделенного гнусного пользователя.

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

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

Теперь вам нужно задать себе вопрос: "Кого вы пытаетесь помешать прочитать закрытый ключ?? " (конечно, после ответа на другой вопрос: " Вам действительно нужна пара открытого / секретного ключей для клиента ").

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