Прежде всего, чтобы реализовать безопасную связь между вашим клиентским приложением и сервером, концептуально говоря, вам нужен только открытый ключ сервера.Это позволяет вам установить одностороннюю передачу доверительных отношений с сервером и установить безопасный сеанс, в котором гарантируется идентичность сервера.
Хотя, конечно, вышеупомянутый метод не обеспечивает двустороннее доверие(клиент не может быть идентифицирован с сервером), при установлении канала связи в большинстве приложений этот уровень доверия на самом деле не требуется.
Если ваши требования состоят в обеспечении аутентификации клиента на сервере с использованием общедоступного / частногоКлючи, тогда все становится более сложным, потому что если вы поместите ключ в apk, независимо от того, сколько вы его запутываете (включая встраивание его в нативную библиотеку), он только замедлит выделенного гнусного пользователя.
Единственныйспособ сохранить закрытый ключ у клиента - это зашифровать его.Но тогда у вас есть похожая проблема, где хранить ключ дешифрования.Самое простое решение состоит в том, чтобы сгенерировать пару открытого / закрытого ключа для пользователя клиентского приложения и попросить пользователя предоставить симметричный ключ шифрования / дешифрования (который пользователь всегда должен будет вводить) для расшифровки закрытого ключа каждый раз, когдапользователь использует приложение.
Альтернативой может быть использование какого-либо выделенного криптографического устройства, похожего на смарт-карту, для безопасного хранения закрытого ключа, но у вас все еще есть проблема с разрешением приложению читатьключ от устройства (не говоря уже о сложности взаимодействия с указанным устройством).
Теперь вам нужно задать себе вопрос: "Кого вы пытаетесь помешать прочитать закрытый ключ?? " (конечно, после ответа на другой вопрос: " Вам действительно нужна пара открытого / секретного ключей для клиента ").