Подтвердить что ты не робот

Подтверждение подписи сервера покупок в приложении для Android, используя php OpenSSL

В попытке выполнить некоторые из рекомендаций по безопасности для покупки в приложении: 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 напрямую, если это возможно.

4b9b3361

Ответ 1

Я написал библиотеку для проверки ответов на лицензирование Android Маркета, и она доступна в Google Code.

Для проверки лицензии просто требуется несколько строк для PHP, а форматирование ключей и файлов OpenSSL позаботится о вас.

Ответ 2

Можно ли использовать cURL в вашем PHP script, а не материал, встроенный в потоки PHP. Я использовал их раньше, и нашел проблемы более редкими, а сообщения об ошибках более подробными.