robotmedia / AndroidBillingLibrary

Android Market In-app Billing Library
532 stars 179 forks source link

Proguard y Validate signature #88

Closed anin closed 12 years ago

anin commented 12 years ago

Buenas ! , Me surgen un par de consultas que quisiera compartir :

1) La primera es con respecto a proguard , estuve viendo que en el proyecto de la libreria hay un archivo que se llama project.properties que imprimo a continuación ademas de proguard.cfg , imagino que agregando esta linea progaurd.config = proguard.cfg es suficiente para que aplique el mecanismo de proguard correctamente, lo pregunto por que me marea un poco la linea que dice #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt, en resumen estaría bien si lo dejo así como aparece a continuación?

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

progaurd.config = proguard.cfg android.library=true target=Google Inc.:Google APIs:15

2) La segunda consulta es un poco mas conceptual , y tiene que ver con la signedData y la signature que recibimos desde el Market en la respuesta de purchaseStateChanged

Disculpame que pegue codigo :

private void purchaseStateChanged(Context context, Intent intent) { final String signedData = intent.getStringExtra(EXTRA_INAPP_SIGNED_DATA); final String signature = intent.getStringExtra(EXTRA_INAPP_SIGNATURE); BillingController.onPurchaseStateChanged(context, signedData, signature); }

La duda va por el lado de si el signature es la firma con la cual se firmo el Msj ( signature = Encriptar (Hash(MsjOriginal),claveprivada) ) y el signedData es el Mensaje (el Json en plano de la Transacción o si esta encriptado el mismo?)

Por que por lo que yo mas o menos entendí la validación de la firma se haría de la siguiente forma :

Tenemos estas tres cosas *signature = Encriptar (Hash(MsjOriginal),claveprivada) )

*signedData = MsjOriginal o MsjOriginal codificado

*publickey = La obtenemos de la cuenta de publicador de Google

Para validar haríamos:

Encriptar(signature, publickey ) == ? Hash(SignedData) Encriptar(Encriptar(Hash(MsjOriginal),claveprivada) ,clavepublica ) == ? Hash(SignedData) Hash(MsjOriginal) == ? Hash(SignedData)

pero no me cierra el razonamiento si el SignedData no esta en texto plano .

Saludos!

hpique commented 12 years ago

Hola @anin.

1) proguard.cfg lo generó automáticamente Eclipse y me olvidé de quitarlo. Si usas Proguard siéntete libre de adaptarlo a las necesidades de tu proyecto.

2) signedData y signature están definidos en la documentación de in-app billing. Como es un poco larga lo copio:

Signed data

A String representing the signed JSON string. The JSON string contains information about the billing transaction, such as order number, amount, and the item that was purchased or refunded.

Signature

A String representing the signature of the JSON string.

La validación la puedes ver en DefaultSignatureValidator.