Чтобы попытаться выполнить некоторые из рекомендаций по безопасности для покупки внутри приложения: http://developer.android.com/guide/market/billing/billing_best_practices.html
Я пытаюсь выполнить проверку подписи на сервере, а не в самом приложении. В идеале я хотел бы использовать библиотеки php openssl, и он выглядит как код, такой как следующее:
<?php // $data and $signature are assumed to contain the data and the signature // fetch public key from certificate and ready it $fp = fopen("/src/openssl-0.9.6/demos/sign/cert.pem", "r"); $cert = fread($fp, 8192); fclose($fp); $pubkeyid = openssl_get_publickey($cert); // state whether signature is okay or not $ok = openssl_verify($data, $signature, $pubkeyid); if ($ok == 1) { echo "good"; } elseif ($ok == 0) { echo "bad"; } else { echo "ugly, error checking signature"; } // free the key from memory openssl_free_key($pubkeyid); ?>
Я заменяю подпись на base64-декодированную строку подписи в комплекте для покупки приложений и использую данные из того же пакета. Открытый ключ должен быть в формате PEM, и я добавил токены BEGIN и END и некоторые разрывы строк.
Моя проблема в том, что я не могу заставить этот код PHP успешно проверять данные / подпись, и я не знаю, что нужно изменить, чтобы заставить его работать правильно.
Если я использую openssl, создайте закрытый и открытый ключ, создайте подпись для тех же данных, используя sha1, и запустите его через указанный выше PHP-код, он отлично работает и успешно проверяется.
Вот как я использую OpenSSL:
openssl genrsa -out private.pem openssl rsa -in private.pem -pubout -out public.pem
то я использую private.pem и некоторый php-код для генерации подписи:
... openssl_sign($data, $signature, $pkeyid); ...
У кого-нибудь есть какой-либо рабочий пример php-кода с проверкой на стороне сервера сигнатур внутри приложения?
Я мог бы просто запустить эквивалентный Java-код, который находится в образце приложения, и, похоже, работает нормально, но я хотел бы использовать php напрямую, если это возможно.
Я написал библиотеку для проверки ответов на лицензирование на Android Маркете, и она доступна в Google Code .
Для проверки лицензии требуется всего несколько строк PHP, а форматирование ключей и файлов OpenSSL позаботится о вас.
Возможно ли использовать cURL в вашем PHP-скрипте, а не в материалах, встроенных в потоки PHP. Я использовал их раньше, и нашел проблемы более редкими, а сообщения об ошибках более подробными.