Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo proteger la clave pública de Google Play al realizar la facturación de InApp

En realidad, esto es un poco tonto sobre la protección de la clave pública (¿cuál es la definición de clave pública entonces?), Pero según la documentación de Google :

Para mantener su clave pública a salvo de usuarios maliciosos e intrusos, no lo incorpore en ningún código como una cadena literal. En su lugar, construya la cadena en tiempo de ejecución a partir de piezas o utilice la manipulación de bits (por ejemplo, XOR con alguna otra cadena) para ocultar la clave real. La clave en sí no es información secreta, pero no quiere que sea fácil para un hacker o un usuario malintencionado reemplazar la clave pública por otra clave.

¿Hay alguna manera recomendada de hacerlo?

Sé que hay muchas maneras de hacerlo, simplemente no quiero seguir la misma manera cómo la gente maneja hash de contraseña en el pasado (por ejemplo, md5, sha1 etc), quiero saber la mejor práctica en el caso de uso anterior.

  • ¿Cómo cambia el color del subrayado de Edittext en 4.0+?
  • Cuándo utilizar / no utilizar un adaptador de sincronización
  • Cómo integrar Unity en una actividad de Android
  • Android: botón de acción flotante en posición incorrecta
  • Android ExpandableListView no se expande / no se puede hacer clic
  • Oyente de ubicación en el servicio de fondo Android
  • SQLiteDatabase: Insertar sólo si el valor no existe (no a través del comando raw SQL)
  • El cálculo del tiempo de salida no coincide con el resultado de Google
  • 5 Solutions collect form web for “Cómo proteger la clave pública de Google Play al realizar la facturación de InApp”

    Esto surge mucho por aquí 🙂 La idea detrás del párrafo que está citando es que para que la facturación en la aplicación sea segura, debe verificar las firmas de transacción. Ésos se firman con una llave privada, asociada con su cuenta del revelador. La clave reside en los servidores de Google, por lo que es bastante seguro asumir que nadie más puede firmar datos con él. Para verificarlo, necesita su clave pública, que puede copiar desde la consola del desarrollador. Si alguien la reemplazó en su aplicación, podría engañarla para que acepte transacciones de facturación en la aplicación de fuentes no autorizadas, ya que si instalan la clave pública, también probablemente controlan la clave privada correspondiente. En la práctica sin embargo, es mucho más fácil simplemente modificar su código en los lugares correctos para siempre devolver true para isLicensed() , hasItem() o métodos similares que pueda tener y nadie lo hace.

    La mejor manera de proteger la clave es, por supuesto, no tener la llave en su aplicación en absoluto. Mueva toda la lógica de validación de transacciones a su servidor y utilice HTTPS para conectarse a ella. Valide correctamente la cadena de certificados para asegurarse de que está hablando con su (s) propio (s) servidor (es). De lo contrario, alguien podría jugar con DNS y engañar a su aplicación para conectarse a sus propios servidores. Un ataque similar contra la compra de iOS se anunció hace un par de semanas.

    Lo siguiente mejor es, de alguna manera, ofuscar la clave, y tenerla incluida en tu aplicación. Esto tiene la ventaja de que usted no necesita un servidor, pero la desventaja es que si alguien está lo suficientemente determinado lo averiguarán, ya que siempre puede invertir el código de bytes de su aplicación. Por lo tanto, su mejor apuesta es llegar a su propia forma original de hacerlo que no aparece en los foros públicos 🙂 Para hacerlo un poco más difícil, puede implementar la parte de validación en código nativo, que es más difícil (pero no Imposible) para analizar. Sin embargo, como se mencionó anteriormente, remendar código de byte en los lugares correctos es mucho más fácil que tratar de reemplazar la clave pública, por lo que es lo que la mayoría de las galletas harán.

    Haga por lo menos la transformación simple del texto. La idea es que el desensamblaje de dex no revelará su clave pública.

    A continuación se muestra un ejemplo de función que hace que la codificación / decodificación de cadena sea simple:

     /** * Simple String transformation by XOR-ing all characters by value. */ static String stringTransform(String s, int i) { char[] chars = s.toCharArray(); for(int j = 0; j<chars.length; j++) chars[j] = (char)(chars[j] ^ i); return String.valueOf(chars); } 

    A continuación, su clave privada se almacena en la fuente como cadena codificada (codificar con esta función), y decodificado en tiempo de ejecución con la misma función. Este es el tipo de "XOR" método sugerido por Google.

    Usted hace el parámetro "yo" usted mismo, cualquier cosa al azar tal como 0x27 u otro trabajará. Si ocultas más cadenas de esta manera, utiliza diferentes 'i' para cada transformación.

    Como alternativa a la ofuscación manual de la tecla, también puede permitir que un obfuscador lo haga automáticamente. ProGuard es parte del SDK de Android, pero casi siempre ofusca nombres de clase / campo / método, no cadenas. Su hermano especializado para Android, DexGuard , puede agregar más capas de ofuscación, aplicando cifrado de cadena, cifrado de clase y reflexión. No es gratis, pero ahorra tiempo y es probablemente más efectivo que hacerlo manualmente.

    (Soy el desarrollador de ProGuard y DexGuard)

    Guarde su clave pública en el lado del servidor y una vez que obtenga la respuesta de google play para verificar la clave enviar esa respuesta al servidor y realizar su operación allí en el servidor.

    La clave pública es codificada en base64 ( [a-zA-Z0-9+/] ) para que pueda evitar fácilmente la necesidad de escapar de la cadena ofuscada en absoluto, ya que es un problema molesto en la solución de @ PointerNull.

    En su lugar, puede realizar la ofuscación convirtiendo primero el carácter en cuestión en un int de 6 bits. A continuación, haga la manipulación de bits (por ejemplo, XOR-ing) y luego convertir de nuevo a un char codificado en base64. Garantizado sin escapar de personaje necesario.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.