Пример приложения , на который ссылается руководство разработчика 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()
.
Как мне помешать злоумышленнику декомпилировать мое приложение и заменить что-то , чтобы обойти проверку в приложении-покупки?