Как проверить, что покупка была подписана правильно с помощью открытого ключа разработчика, на стороне сервера сделает приложение более безопасным? - PullRequest
3 голосов
/ 07 июля 2019

На основании примера кода покупки в приложении на https://github.com/googlesamples/android-play-billing/blob/master/TrivialDrive_v2/shared-module/src/main/java/com/example/billingmodule/billing/BillingManager.java#L369

/**
 * Verifies that the purchase was signed correctly for this developer's public key.
 * <p>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.
 * </p>
 */
private boolean verifyValidSignature(String signedData, String signature) {

Мне было интересно, как выполнение такой проверки на стороне сервера сделает приложение более безопасным?

Как, я полагаю, хакер может просто

  1. Force verifyValidSignature вернуть true, даже не связываясь со стороной сервера.
  2. Я верю в код приложения, будут такие функции, как isThisPaidUser(). Хакер может просто заставить эти функции возвращать true.

Могу ли я знать, как "выполнить такую ​​проверку на вашем бэкэнде" лучше?

1 Ответ

0 голосов
/ 08 июля 2019

Для этого вы можете использовать разные языки.Во-первых, избегайте использования логической переменной, то, что возвращает сервер, может быть строкой «что угодно», вот пример:

<?php 
// get data param
$data = $_GET['data'];

// get signature param
$signature = $_GET['signature'];

// get key
$key_64 = "";



$key =  "-----BEGIN PUBLIC KEY-----\n".
    chunk_split($key_64, 64,"\n").
    '-----END PUBLIC KEY-----';
//using PHP to create an RSA key
$key = openssl_get_publickey($key);


// state whether signature is okay or not
$ok = openssl_verify($data, base64_decode($signature), $key, OPENSSL_ALGO_SHA1);
if ($ok == 1) {
    echo "good";
} elseif ($ok == 0) {
    echo "bad";
} else {
    die ("fault, error checking signature");
}

// free the key from memory
openssl_free_key($key);

?>

На стороне клиента вы можете использовать крошечную lib StringCare / AndroidLibrary для шифрования строки и сравнения результатов работы сервера:

result.toString().equals("ecryptedstring")

Если злоумышленник использует apktool, jadx или другие для просмотра кода, он не сможет легко расшифровать строку, библиотека использует java-шифр для генерации X509-сертификата для вашей строки, StringCare для этого требуется последний отпечаток вашего приложения, но имеет .equals может быть заменен на equals (true), вам нужно лучшее запутывание, возможно, используя xor с податливостью с вложеннымпопробуйте поймать и протестировать его с популярными библиотеками, использующими хакер.

Более сложная система - отправить файл purchase.sku, purchase.purchaseToken на сервер Google API, используя in-app-purchasenpm lib , которые помогают проверять подписки и другие.

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