He leído muchos documentos y códigos que, en teoría, validarán un recibo en la aplicación y / o paquete.
Dado que mi conocimiento de SSL, certificados, cifrado, etc., es casi nulo, todas las explicaciones que he leído, como esta prometedora , me han resultado difíciles de entender.
Dicen que las explicaciones son incompletas porque cada persona tiene que descubrir cómo hacerlo, o los hackers tendrán un trabajo fácil creando una aplicación de cracker que pueda reconocer e identificar patrones y parchear la aplicación. OK, estoy de acuerdo con esto hasta cierto punto. Creo que podrían explicar completamente cómo hacerlo y poner una advertencia que diga "modificar este método", "modificar este otro método", "ofuscar esta variable", "cambiar el nombre de esto y aquello", etc.
¿Puede una buena alma tener la amabilidad de explicar cómo validar LOCALMENTE, agrupar recibos y recibos de compra en la aplicación en iOS 7 ya que tengo cinco años (ok, que sea 3), de arriba a abajo, claramente?
¡¡¡Gracias!!!
Si tiene una versión trabajando en sus aplicaciones y le preocupa que los hackers vean cómo lo hizo, simplemente cambie sus métodos sensibles antes de publicar aquí. Ofusque cadenas, cambie el orden de las líneas, cambie la forma en que realiza los bucles (de usar para bloquear la enumeración y viceversa) y cosas así. Obviamente, cada persona que usa el código que puede publicarse aquí, tiene que hacer lo mismo, para no arriesgarse a ser hackeada fácilmente.
Respuestas:
Aquí hay un tutorial sobre cómo resolví esto en mi biblioteca de compras en la aplicación RMStore . Explicaré cómo verificar una transacción, lo que incluye verificar el recibo completo.
De un vistazo
Obtenga el recibo y verifique la transacción. Si falla, actualice el recibo e intente nuevamente. Esto hace que el proceso de verificación sea asíncrono, ya que la actualización del recibo es asíncrona.
Desde RMStoreAppReceiptVerifier :
Obteniendo los datos del recibo
El recibo está dentro
[[NSBundle mainBundle] appStoreReceiptURL]
y es en realidad un contenedor PCKS7. Apesto con la criptografía, así que usé OpenSSL para abrir este contenedor. Otros aparentemente lo han hecho puramente con marcos de sistema .Agregar OpenSSL a su proyecto no es trivial. El wiki de RMStore debería ayudar.
Si opta por utilizar OpenSSL para abrir el contenedor PKCS7, su código podría verse así. De RMAppReceipt :
Entraremos en los detalles de la verificación más adelante.
Obteniendo los campos de recibo
El recibo se expresa en formato ASN1. Contiene información general, algunos campos para fines de verificación (lo veremos más adelante) e información específica de cada compra en la aplicación aplicable.
Nuevamente, OpenSSL viene al rescate cuando se trata de leer ASN1. Desde RMAppReceipt , utilizando algunos métodos auxiliares:
Obtener las compras en la aplicación
Cada compra en la aplicación también está en ASN1. Analizarlo es muy similar a analizar la información general del recibo.
Desde RMAppReceipt , utilizando los mismos métodos de ayuda:
Cabe señalar que ciertas compras en la aplicación, como consumibles y suscripciones no renovables, aparecerán solo una vez en el recibo. Debe verificarlos justo después de la compra (nuevamente, RMStore lo ayuda con esto).
Verificación de un vistazo
Ahora tenemos todos los campos del recibo y todas sus compras en la aplicación. Primero verificamos el recibo en sí, y luego simplemente verificamos si el recibo contiene el producto de la transacción.
A continuación se muestra el método que llamamos al principio. Desde RMStoreAppReceiptVerificator :
Verificando el recibo
La verificación del recibo en sí se reduce a:
Los 5 pasos en el código de alto nivel, desde RMStoreAppReceiptVerificator :
Analicemos los pasos 2 y 5.
Verificación de la firma del recibo
Cuando extrajimos los datos, revisamos la verificación de la firma del recibo. El recibo se firma con el Certificado raíz de Apple Inc., que se puede descargar de la Autoridad certificadora raíz de Apple . El siguiente código toma el contenedor PKCS7 y el certificado raíz como datos y comprueba si coinciden:
Esto se hizo al principio, antes de analizar el recibo.
Verificación del hash del recibo
El hash incluido en el recibo es un SHA1 de la identificación del dispositivo, algún valor opaco incluido en el recibo y la identificación del paquete.
Así es como verificarías el hash de recibo en iOS. De RMAppReceipt :
Y esa es la esencia de esto. Puede que me falte algo aquí o allá, así que podría volver a esta publicación más tarde. En cualquier caso, recomiendo navegar por el código completo para más detalles.
fuente
Me sorprende que nadie haya mencionado Receigen aquí. Es una herramienta que genera automáticamente un código de validación de recibo ofuscado, uno diferente cada vez; Es compatible con la GUI y la operación de línea de comandos. Muy recomendable.
(No afiliado a Receigen, solo un usuario feliz).
Utilizo un Rakefile como este para volver a ejecutar automáticamente Receigen (porque debe hacerse en cada cambio de versión) cuando escribo
rake receigen
:fuente
Esta es una versión de Swift 4 para la validación del recibo de compra en la aplicación ...
Vamos a crear una enumeración para representar los posibles errores de la validación del recibo
Luego, creemos la función que valida el recibo, arrojará un error si no puede validarlo.
Usemos esta función auxiliar para obtener la fecha de vencimiento de un producto específico. La función recibe una respuesta JSON y una identificación del producto. La respuesta JSON puede contener información de recibos múltiples para diferentes productos, por lo que obtiene la última información para el parámetro especificado.
Ahora puede llamar a esta función y manejar los posibles casos de error
Account tab
Do Sign in
Open iTune Connect
Open My App
Open Feature Tab
Open In App Purchase
Click at the right side on 'View Shared Secret'
At the bottom you will get a secrete key
Espero que esto ayude a todos los que quieran eso en la versión rápida.
fuente