В безопасности биллинга приложений

Я закончил разработку своего приложения, которое используется в биллинге приложений v3. Мое приложение - приложение справки для справки, в котором есть список вопросов, которые вставляются в базу данных. Вещь, которая меня волнует, - это безопасность, поскольку помимо прогурда почти ничего. Мое приложение запрашивает инвентарь для купленных товаров, поэтому хранение покупок не является проблемой.

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

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

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

Итак, по существу, вопрос:

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

Большое спасибо!

Разъяснение:

Нет задействованного сервера. Данные хранятся в приложении. Когда запрашивается инвентарь (методом queryinventoryasync), он возвращается обратно, если инвентарь покупается или нет, и он запускается каждый раз, когда приложение запускается. В моем биллинге приложений я предполагаю, что все в порядке, я спрашиваю больше о моем собственном приложении открытого ключа приложения - я должен как-то сделать это сложнее, но в настоящее время я только что сломал его на 15 строк, и я просто "добавляю", они друг к другу во время выполнения, но это едва ли лучше, чем просто наличие одной строки. Я бы хотел зашифровать его, как-то просто не знаю, как это сделать.

Ответ 1

Хороший вопрос.

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

Что вы можете сделать, так это использовать так называемое XOR-шифрование. Вот пример, если методы XOR-encrypter и decrypter.

public static String xorEncrypt(String input, String key) {
    byte[] inputBytes = input.getBytes();
    int inputSize = inputBytes.length;

    byte[] keyBytes = key.getBytes();
    int keySize = keyBytes.length - 1;

    byte[] outBytes = new byte[inputSize];
    for (int i=0; i<inputSize; i++) {
        outBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keySize]);
    }

    return new String(Base64.encode(outBytes, Base64.DEFAULT));
}

public static String xorDecrypt(String input, String key) {
    byte[] inputBytes = Base64.decode(input, Base64.DEFAULT);
    int inputSize = inputBytes.length;

    byte[] keyBytes = key.getBytes();
    int keySize = keyBytes.length - 1;

    byte[] outBytes = new byte[inputSize];
    for (int i=0; i<inputSize; i++) {
        outBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keySize]);
    }

    return new String(outBytes);
}

Как вам нужно выбрать строку пароля (String key) и зашифровать свой открытый ключ (String input), используя его. Этот зашифрованный ключ, который вы можете сохранить в классе. Когда вам нужно ваше реальное значение ключа, вы вызываете xorDecrypt() с помощью пароля и общедоступной (зашифрованной) строки ключа. Пароль - это строка, которую вы храните где-то в своем коде. Как я уже сказал, мы действительно не защищаем его, но мы затрудняем его поиск и/или замену.

Вы можете добавить более сложную логику о том, как объединить зашифрованный открытый ключ и пароль. Это просто добавляет больше сложностей, но не даст вам никаких гарантий, что ваш ключ не будет дешифрован. В любом случае Google подтверждает Шифрование XOR лучше, чем ничего.

Android 4.3 добавил еще некоторые функции безопасности, которые можно использовать и для хранения открытых ключей. Это решение потребует, чтобы серверная связь и аппаратная поддержка были действительно безопасными. Это Улучшения Key Chain и Android Keystore Provider.