2012-07-12 8 views

Respuesta

4

La clave pública presente en su Consola de desarrollador de Android (que se puede encontrar en 'Editar perfil') ya está codificada en Base64. Solo copie y pegue el contenido de la clave en su archivo fuente. Por ejemplo, si tiene algo como esto:

enter image description here

Luego, en su Security.java:

String base64EncodedPublicKey = "MIIBIjANBgkqhkiG9w0BAQ......"; 
+0

base64EncodedPublicKey debe ser la CLAVE PÚBLICA DE SU APLICACIÓN (que obtuvo de la consola para desarrolladores de Google Play). Esta no es su clave pública de desarrollador, es la clave pública * específica de la aplicación. En lugar de simplemente almacenar toda la cadena literal aquí incrustada en el programa, construya la clave en el 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 queremos que sea fácil para un atacante reemplazar la clave pública con uno de los suyos y luego falsificar los mensajes del servidor. – rocknow

+0

Esto fue en los viejos tiempos donde teníamos una clave de desarrollador única, utilizada para la licencia y en la aplicación. – aromero

+2

Su clave pública RSA codificada en Base64 para la facturación de licencias y aplicaciones se ha movido y ahora se puede encontrar en Goggle Play seleccionando su aplicación y luego haciendo clic en la pestaña "Servicios y API". – birdman

1

Usted necesita la clave pública en el código fuente del programa para que pueda comprobar la firma. Sí, existe un riesgo no nulo e inevitable de que un cracker lo encuentre, lo sustituya por un falso y alimente las compras falsas de su programa.

No puede ocultar completamente la llave de las miradas indiscretas, pero puede ofuscarse. Puede dividir la cadena Base64 en varias constantes de cadena en diferentes puntos y concatenarlos antes de su uso. Mejor dar a los trozos nombres poco llamativos (no como MY_PUBLIC_KEY_PART_4). También puede aplicarle una capa adicional de cifrado suave, algo así como XOR un valor. Puede agregar una verificación de integridad: asegúrese de que la clave no se haya falsificado (por ejemplo, guarde el hash de una clave en otro lugar y verifique). Pero todo esto sigue siendo seguridad a través de la oscuridad: un pirata informático suficientemente determinado lo logrará.

Considere también ProGuard, la herramienta de ofuscación de códigos incorporada.

+3

No necesita ocultar u oscurecer la clave pública. Google firmará solicitudes utilizando una clave secreta (que usted (el desarrollador) no tiene y no estará presente en su aplicación). La clave pública solo se usa para verificar esa firma. Un cracker no puede crear una compra falsa utilizando la clave pública. – aromero

+1

Un cracker puede reemplazar la clave pública en la memoria de la aplicación con la suya y firmar las compras con su propia clave privada. Es por eso que Google recomienda que te ofusques. –

+0

Tienes razón, pensé que estabas hablando de la clave en sí. – aromero

0

Si tiene un componente de servidor como parte de su aplicación, puede mover la mayoría de los elementos de su seguridad, incluida su clave pública, a su servidor. En el servidor, puede generar el nonce y verificar la compra (he trasladado el mío a un servicio WCF de RESTFul). Si su componente de servidor está basado en .NET, entonces probablemente tendrá que generar un módulo y un exponente de su clave pública para que pueda usar la clase RNGCryptoServiceProvider. Hay un video de Google I/O que ofrece una descripción general to In-App Billing, entre otros.

+0

¿Qué quiere decir con ~ "** módulo y un exponente **? ¿Funciona con la clave codificada en base64 para la facturación en la aplicación? –

2

Como dice el código de ejemplo de Google para la facturación desde la aplicación, debe ocultar esta clave pública.

En lugar de simplemente almacenar toda la cadena literal aquí incrustado en el programa , construir la clave en tiempo de ejecución a partir de piezas o la manipulación uso 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 queremos hacer que sea fácil para un atacante reemplazar la clave pública con un propio y luego falsificar mensajes del servidor.

Utilizo un código Java muy simple para generar la clase Java que me devolverá la clave pública. La idea básica es usar la recursión para recrear la clave utilizando una clase estática interna. Es solo comida para pensar.

Es un enfoque "lo suficientemente bueno" para mi nicho de mercado.Consulte this stackexchange security question para obtener más información sobre ofuscación.

public static void main(String[] args) throws Exception { 
    String className = genClassName(); 
    PrintWriter writer = new PrintWriter("C:\\" + className + ".java", "iso-8859-1"); 
    printClass(className, writer, "XXXXXX-YOUR-PUBLIC-KEY-GOES-HERE-XXXXXXX", true); 
    writer.close(); 
} 

private static String genClassName() { 
    return "Class" + UUID.randomUUID().toString().replaceAll("-", ""); 
} 

private static String printClass(String thisClass, PrintWriter writer, String key, boolean root) { 
    int split = key.length()/2; 
    if (split < 10) { 
     writer.println("public " + (root ? "" : "static") + " class " + thisClass + " {"); 
     writer.println("public static String get() {"); 
     writer.println("return \"" + key + "\";"); 
     writer.println("}"); 
     writer.println("}"); 
    } else { 
     String first = key.substring(0, split); 
     String last = key.substring(split, key.length()); 
     writer.println("public " + (root ? "" : "static") + " class " + thisClass + " {"); 
     String class1 = printClass(genClassName(), writer, first, false); 
     String class2 = printClass(genClassName(), writer, last, false); 
     writer.println("public static String get() {"); 
     writer.println("return " + class1 + ".get() + " + class2 + ".get();"); 
     writer.println("}"); 
     writer.println("}"); 
    } 

    return thisClass; 
} 
Cuestiones relacionadas