Intereting Posts
Facebook XMPP Chat API отправить сообщение PHP Удалить имя контроллера из URL-адресов в Yii2 Какова наилучшая практика для ограничения определенных страниц для входа в систему только в Codeigniter? как я могу опубликовать значение текстового поля, которое динамически создается jquery PHP regex анализирует данные между Библиотека GD создает изображение с динамическим текстом на нем phpmailer отправить gmail smtp timeout Получайте содержимое корзины за пределами Magento, но в том же домене Переместить элемент в ассоциативный массив в PHP Сохранить удаленный img-файл на сервере, с php Являются ли методы магии лучшей практикой в ​​PHP? Проблема Сохранение значений широты и долготы в базе данных MySQL искать точное слово по datatables я получил эту ошибку 500 | Внутренняя ошибка сервера | Doctrine_Connection_Mysql_Exception Проблема с веб-формой, используемой для добавления и удаления имен клиентов

Как проверить хэш UID на стороне сервера Apple AppReceipt в PHP?

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

Контекст: Apple представила AppReceipt в iOS 7. Он также присутствует для OS X IAP. Эта квитанция представляет собой контейнер PKCS № 7 (asn.1) с полезной нагрузкой, которая также является структурой asn.1. Документация от Apple предписывает, как контролировать достоверность получения на устройстве и анализировать его, чтобы проверить, что было выпущено для текущего устройства. Также есть инструкции для подтверждения получения через сервер приложений, связавшись с сервером Apple. Однако в последнем случае возвращенные данные json от Apple не содержат информации, идентифицирующей исходное устройство. Предыдущая модель протокола IAP с транзакциейReceipt включала идентификатор идентификатора forVendor в json.

Вопрос. Как выполнить синтаксический анализ бинарной квитанции на сервере с помощью PHP для проверки хеша UID, чтобы гарантировать, что эта квитанция принадлежит этому устройству? Это можно сделать до или после отправки квитанции на сервер Apple.

Этот скрипт проверяет только хэш, а не всю действительность подписи квитанции. Эта работа остается в Apple, отправив им квитанцию, как задокументировано.

Хэш-проверка непосредственно адаптируется из кода документа, описанного в Apple, в C. Сложная задача заключается в поиске правильных фрагментов информации из двоичной квитанции.

Этот код использует парсер ASN1 от Kris Bailey , ссылка также находится в исходном коде.

Вам нужно изменить один комментарий в коде сценария парсера: строка комментариев # 189 и раскоммент № 190. Также последняя функция в скрипте синтаксического анализа не используется и может быть удалена.

<?php //$vendID should be a binary string. If you have the vendorID as an ASCII string, convert it back // $vendID = hex2bin(str_replace('-', '', $vendID_string)); //PHP 5.4+ $vendID = hextobin(str_replace('-', '', $vendID_string)); //PHP 5.3- function below require_once 'ans1.php'; //donwnload from http://www.phpkode.com/source/s/mistpark-server/library/asn1.php $asn_parser = new ASN_BASE; //parse the receipt binary string $pkcs7 = $asn_parser->parseASNString($receipt->bin); // $asn_parser->printASN($pkcs7); //uncomment this line to print and inspect PKCS7 container //target the payload object inside the container $payload_sequence = $pkcs7[0]->asnData[1]->asnData[0]->asnData[2]->asnData; //control the OID of payload if ($payload_sequence[0]->asnData != '1.2.840.113549.1.7.1') { echo "invalide payload OID"; exit; } //the payload octet_string is itself an ASN1 structure. Parse it. $payload = $asn_parser->parseASNString($payload_sequence[1]->asnData[0]->asnData); // $asn_parser->printASN($payload); //uncomment this line to print and inspect payload ASN structure $payload_attributes = $payload[0]->asnData; //array of ASN_SEQUENCE foreach ($payload_attributes as $attr) { $type = $attr->asnData[0]->asnData; switch ($type) { case 2: $bundle_id = $attr->asnData[2]->asnData; break; // case 3: // $bundle_version = $attr->asnData[2]->asnData; // break; case 4: $opaque = $attr->asnData[2]->asnData; break; case 5: $hash = $attr->asnData[2]->asnData; break; default: break; } } //compute the hash $hash_loc = sha1($vendID . $opaque . $bundle_id, true); //control hash equality if ($hash_loc == $hash) { echo "OK\n"; } else { echo "KO\n"; } echo "</pre>\n"; //******************************************************* function hextobin($hexstr) { $n = strlen($hexstr); $sbin = ''; for ($i = 0; $i < $n; $i += 2) $sbin .= pack("H*", substr($hexstr,$i,2)); return $sbin; } ?>