Проверка покупок в приложении - PullRequest
0 голосов
/ 29 апреля 2018

Пример приложения , на который ссылается руководство разработчика Google , имеет метод с именем verifyValidSignature(), который выглядит следующим образом в классе BillingManager:

/**
 * Verifies that the purchase was signed correctly for this developer's public key.
 *
 * Note: It's strongly recommended to perform such check on your backend since hackers can
 * replace this method with "constant true" if they decompile/rebuild your app.
 */
private boolean verifyValidSignature(String signedData, String signature) {
    try {
        return Security.verifyPurchase(BASE_64_ENCODED_PUBLIC_KEY, signedData, signature);
    } catch (IOException e) {
        Log.e(TAG, "Got an exception trying to validate a purchase: " + e);
        return false;
    }
}

Что именно они подразумевают под «выполнить такую ​​проверку на вашем бэкэнде» ? Какой бэкэнд?

Этот метод вызывается из этого метода (также в BillingManager):

private void handlePurchase(Purchase purchase) {
    if (!verifyValidSignature(purchase.getOriginalJson(), purchase.getSignature())) {
        Log.i(TAG, "Got a purchase: " + purchase + "; but signature is bad. Skipping...");
        return;
    }

    Log.d(TAG, "Got a verified purchase: " + purchase);

    mPurchases.add(purchase);
}

Я не совсем понимаю, что я должен делать с указанным бэкэндом, то есть не дать атакующему просто удалить

if (!verifyValidSignature(purchase.getOriginalJson(), purchase.getSignature())) {
    Log.i(TAG, "Got a purchase: " + purchase + "; but signature is bad. Skipping...");
    return;
}

так же легко, как заменить verifyValidSignature() на «константа true» , как предупреждает JavaDoc для verifyValidSignature().

Как мне помешать злоумышленнику декомпилировать мое приложение и заменить что-то , чтобы обойти проверку в приложении-покупки?

...