Как проверить личность приложения, отправляющего запрос POST

1

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

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

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

В основном я хочу избежать этих проблем:

1) Кто-то не создает поддельное имя пакета и затем отправляет запрос 2) Кто-то не перекомпилирует мое приложение и затем отправляет запрос 3) Кто-то, если не отслеживает ответ сервера через MIM

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

Но мне не удалось найти ключ, который прикреплен к ключу подписи приложения и к которому не может получить доступ кто-либо, имеющий APK моего приложения.

Любая помощь будет благодарна.

Теги:
http
reverse-engineering
signature

1 ответ

0
Лучший ответ

Вы можете добавить дополнительный уровень защиты, если создаете ключи в своем приложении, используя код C++, доступный в библиотеках Android NDK. Вот удивительный урок для этого. По сути, это защищает ваше приложение от инструментов декомпиляции, которые обычно декомпилируют файлы Java. Кроме того, я рекомендую добавить шифрование AES на ваши ключи перед отправкой через почтовый запрос вашего SSL-сервера.

В вашем onCreate() получите ключ от собственной реализации C++:

String nativeKey = invokeNativeFunction()

затем зашифруйте его:

byte[] keyStart = nativeKey.getBytes();
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(keyStart);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] key = skey.getEncoded();    

// encrypt
byte[] encryptedData = encrypt(key,b);

Метод шифрования:

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
}

Редактировать для CSRF:

Здесь есть интересный ответ: Authenticity_token в Rails + Android, также в Википедии, есть довольно много предложений относительно того, как противостоять подделке межсайтовых запросов. который включает в себя:

Synchronizer token pattern
Cookie-to-header token

назвать несколько.

Здесь слой дополнительной безопасности, чтобы идентифицировать подлинность запроса приложения, а также.

  • 0
    Спасибо за ответ. Не знаю, почему кто-то проголосовал за ответ. Но на самом деле мне также требуется проверить подлинность приложения, отправляющего POST, чтобы убедиться, что запрос отправляется только моим исходным приложением. Есть ли какой-либо ключ, может быть мой ключ сертификата, который может быть получен ТОЛЬКО моим приложением во время выполнения и который прикреплен к запросу POST, а затем мой сервер проверяет ключ. Но ключ не должен быть доступен любому, например, пользователю с правами root или пользователю, у которого есть мой apk. ПОЖАЛУЙСТА ПОМОГИ.
  • 0
    Эту часть немного сложно реализовать. Если у вас есть пользователи в вашем приложении, было бы хорошо реализовать access_token чтобы гарантировать, что пользователи приложения могут получить доступ только к вашему приложению. Затем включите этот токен доступа в свой почтовый запрос
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню