Как проверить личность приложения, отправляющего запрос POST - PullRequest
0 голосов
/ 11 февраля 2019

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 11 февраля 2019

Вы можете добавить дополнительный уровень защиты, если создаете ключи в своем приложении, используя код 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 , также в Wikipedia , есть довольно много предложений относительно того, как противостоять подделке межсайтовых запросов.который включает в себя:

Synchronizer token pattern
Cookie-to-header token

и многие другие.

Ниже приведен уровень дополнительной безопасности для идентификации подлинности запроса приложения .

...