2012-05-09 14 views
5

SÍ, he leído todos los documentos @ developer.android.com y entiendo todo con una excepción básica: para qué se introdujo.Android InApp Billing: ¿para qué sirven realmente?

Dado que todas las respuestas de pedidos de Google Play vienen firmadas por clave privada inaccesible por cualquier persona y están siendo verificadas por clave pública emparejada (en mi caso en servidor externo, por lo que también es inaccesible para tercera persona) simplemente (casi) no hay forma de burlar.

Todos estos nonces son solo una forma redundante de asegurar las compras. Y lo que es más, los documentos no dicen nada sobre la situación, cuando:

  1. Compro un artículo;
  2. Generar nonce y enviarlo a Google Play;
  3. Have a crash, así que todos mis conocidos nonces se pierden;
  4. Tengo mi aplicación reiniciada y recibí una devolución de llamada de Google Play;
  5. ... Y rechazar esta llamada debido a no haber reconocido nonce!

En situación descrita anteriormente el usuario paga por un artículo y nunca lo consigue, lo que es vergonzoso. Por supuesto, puedo almacenar nonces en algún archivo y volver a leerlo cuando mi aplicación vuelva, pero viola todos los principios de nonces.

En mi humilde opinión, alguien acaba de decir "Oye, el proceso de verificación es demasiado simple, vamos a añadir algo más con la aleatoriedad, ¡será mucho más genial!". Así que alguien lo hizo.

O, ¿me abriría la puerta a otro caso de uso que me falta? De lo contrario, eliminaré toda la parte nonces de mi código.

+0

Si las compras se gestionan, recuerda que siempre hay la posibilidad de restaurar las compras , que los usuarios necesitarán si alguna vez 1. obtienen un nuevo dispositivo, 2. tienen que restablecer el dispositivo de fábrica. – weston

+0

Tienes razón, me olvidé de ellos ya que no tengo ninguno, pero ¿cómo está conectado con nonces? –

+0

Simplemente su escenario de "el usuario paga por un artículo y nunca lo consigue" no es un problema si utiliza compras administradas, por lo que no debe preocuparse por perder nonces en ese caso. No estoy diciendo que sea una respuesta, ¡solo un comentario! – weston

Respuesta

2

No es necesario almacenar el nonce 'en el disco' para dar cuenta de un accidente de aplicación.

Cuando su aplicación falla sí, perderá su lista de nonces conocidos. Sin embargo, cuando su aplicación se reinicia y recibe un IN_APP_NOTIFY, entonces tiene que hacer otro GET_PURCHASE_INFORMATION al hacer esto GET_PURCHASE_INFORMATION, generará un nuevo nonce y lo agregará a la lista conocida como nonces.

Lo que debes recordar es que el nonce es uno por cada GET_PURCHASE_INFORMATION (que te devuelve varios artículos comprados) ni una sola vez por artículo que se compra.

como usted ha dicho que ha implementado su propia manera de evitar ataques de repetición, pero utilizando un nonce es tal vez seguro método

+1

Bueno, gracias, creo que has dado en el clavo. Se debe pensar que Nonces es una de las muchas formas de lidiar con el ataque de respuesta en caso de que no revises algo que sea único: i. mi. orderId en JSON (que es mucho mejor en mi humilde opinión). En mi caso, son inútiles, sin embargo. –

0

Debe ser guardando los nonces generados antes de enviarlos. Las aplicaciones de Android pueden bloquearse o apagarse en cualquier momento, por lo que, en general, todo debería guardarse.

La razón para usar nonces es prevent replay attacks. Estoy lejos de estar calificado para responder si es necesario usar el nonce o no, pero supongo que está ahí por una razón.

+1

Los estoy guardando en la memoria, guardándolos en el disco local exponerlos para que otros los lean/falsifiquen/lo que sea. No tengo que preocuparme por los ataques de respuesta, porque como mencioné las claves asimétricas son lo suficientemente seguras como para asegurarme de que nadie haya falsificado nada. –

+0

Desde un punto de vista de seguridad "en disco" no es diferente de "en memoria". Si su teléfono está rooteado, las aplicaciones tendrían acceso a ambas. Si NO rooteado, tendrían que explotar los errores de seguridad para tener acceso a cualquiera de ellos. – richardwiden

+0

¿Desea decirles a sus usuarios que _THINK_ que _YOUR_ su enfoque está seguro _ENOUGH_? – richardwiden

0

Imagine que su usuario compra un artículo para, por ejemplo, $ 100. Su aplicación recibe una notificación de que hay datos de pago disponibles, la aplicación solicita los datos y la AppStore responde con un PURCHASE_STATE_CHANGED. El usuario registra el mensaje (!) De AppStore y lo guarda.

Más tarde, el usuario imita una notificación a su aplicación, diciéndole que los datos de pago están disponibles (cualquiera puede falsificar eso, ya que esta notificación no está firmada). La aplicación piensa "ah, hey, tal vez me he caído y he perdido toda la información sobre una compra que mi usuario acaba de hacer". Veamos qué dice la AppStore ". Por lo tanto, solicita datos de la tienda de aplicaciones. El usuario interrumpe esa solicitud y envía el mensaje previamente grabado a su aplicación. La aplicación ve el mensaje, lo verifica y descubre que es válido (porque está firmado y todo). Entonces, la aplicación le dará otro artículo valioso de $ 100. Y otro. Cada vez que el usuario repite el mensaje grabado. Por lo tanto llamado: un ataque de repetición.

Sin embargo, hay una cosa que previene tal ataque: el nonce. Si su aplicación envía un nonce en su solicitud de datos de pago, espera recibir el mismo nonce en la respuesta PURCHASE_STATE_CHANGED. Como nonce solo se usa una vez, no puede reproducir mensajes grabados previamente, porque no coincidirán con el nonce que se utilizó en la solicitud.

+0

No es exactamente así. El esquema que has introducido está bien, pero aún no muestra para qué sirven - Soy consciente de un problema como el ataque de respuesta, pero lo trato de otra manera - Estoy muy satisfecho con la respuesta de Google Play en mi servidor externo, donde guardo mi clave pública. Además, para evitar la situación que mencionaste, cada vez que lo hago guardo el ID de pedido único que viene en JSON firmado, no se puede falsificar, porque está firmado y se garantiza que es único. Simplemente ignoro el segundo msg con el mismo ID de pedido. Parece que los nonces son realmente inútiles (incluso más - dañinos como he dicho). –

0

"El nonce actúa como una sal en la transacción, similar a cómo los sistemas * nix almacenan contraseñas. El nonce se usa para agregar entropía al valor cifrado con la clave, eliminando en gran medida la posibilidad de que dos transacciones estén encriptadas y resultan en la misma firma y otros ataques criptográficos similares ".

ver the answer by queso

Cuestiones relacionadas