Я создаю серверный API, который вернет некоторые конфиденциальные ключи моему приложению.
Затем приложение будет использовать эти клавиши для выполнения определенного действия. Я бы отправлял Ключи через SSL, чтобы любая атака "Человек посередине" не могла их прочитать.
Для начала я сначала выберу имя Пакета, а затем я также хочу проверить что-то, что убеждает меня в том, что мое приложение не было декомпилировано и перекомпилировано, а пакет не поддельный.
В основном я хочу избежать этих проблем:
1) Кто-то не создает поддельное имя пакета и затем отправляет запрос 2) Кто-то не перекомпилирует мое приложение и затем отправляет запрос 3) Кто-то, если не отслеживает ответ сервера через MIM
До сих пор я думал, что лучшим способом было бы использовать ключ HASH, а затем сравнить его на моем сервере, чтобы увидеть, совпадает ли ключ POST с тем, который хранится на моем сервере.
Но мне не удалось найти ключ, который прикреплен к ключу подписи приложения и к которому не может получить доступ кто-либо, имеющий APK моего приложения.
Любая помощь будет благодарна.
Вы можете добавить дополнительный уровень защиты, если создаете ключи в своем приложении, используя код 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
назвать несколько.
Здесь слой дополнительной безопасности, чтобы идентифицировать подлинность запроса приложения, а также.
access_token
чтобы гарантировать, что пользователи приложения могут получить доступ только к вашему приложению. Затем включите этот токен доступа в свой почтовый запрос