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;
}
¿Su aplicación tiene un componente de servidor? –
@JohnJSmith Hola, sí, sí :) – Genadinik