2012-07-12 10 views

risposta

4

La chiave pubblica presente nella tua Console per gli sviluppatori Android (che può essere trovata in "Modifica profilo") è già codificata Base64. Basta copiare incollare il contenuto della chiave nel file sorgente. Per esempio, se avete qualcosa di simile:

enter image description here

Poi, nel tuo Security.java:

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

base64EncodedPublicKey dovrebbe essere la CHIAVE PUBBLICA DELLA TUA APPLICAZIONE (che hai ottenuto dalla console degli sviluppatori di Google Play). Questa non è la chiave pubblica dello sviluppatore, è la chiave pubblica * specifica dell'app *. Invece di archiviare l'intera stringa letterale qui incorporata nel programma, costruisci la chiave in fase di esecuzione da pezzi o utilizza la manipolazione dei bit (ad esempio, XOR con qualche altra stringa) per nascondere la chiave effettiva. La chiave in sé non è informazione segreta, ma non vogliamo che sia facile per un utente malintenzionato sostituire la chiave pubblica con uno dei propri e quindi falsi messaggi dal server. – rocknow

+0

Questo era ai vecchi tempi in cui avevamo una chiave di sviluppo unica, utilizzata per le licenze e in-app. – aromero

+2

La chiave pubblica RSA con codifica Base64 per la fatturazione e la fatturazione in-app si è spostata e ora può essere trovata in Goggle Play selezionando l'applicazione, quindi facendo clic sulla scheda "Servizi e API". – birdman

1

è necessaria la chiave pubblica nel codice sorgente del programma in modo che è possibile controllare la firma. Sì, c'è un rischio diverso da zero, inevitabile, che un cracker lo troverà, lo sostituirà con un falso e alimenterà gli acquisti falsi del tuo programma.

Non puoi nascondere completamente la chiave da occhi indiscreti, ma puoi offuscare. È possibile suddividere la stringa Base64 in diverse costanti di stringa in punti diversi e concatenarle prima dell'uso. Meglio dare ai pezzi nomi poco appariscenti (non come MY_PUBLIC_KEY_PART_4). È inoltre possibile applicare un ulteriore livello di crittografia morbida ad esso - qualcosa come XOR un valore. È possibile aggiungere un controllo di integrità: assicurarsi che la chiave non sia stata falsificata (ad esempio, memorizzare l'hash di una chiave altrove e controllare). Ma tutto questo è ancora sicurezza attraverso l'oscurità: un hacker abbastanza determinato riuscirà a passare.

Considerare anche ProGuard, lo strumento di offuscamento del codice incorporato.

+3

Non è necessario nascondere o nascondere la chiave pubblica. Google firmerà le richieste utilizzando una chiave segreta (che tu (sviluppatore) non hai e non sarà presente nella tua applicazione). La chiave pubblica è appena usata per verificare quella firma. Un cracker non può creare un acquisto falso utilizzando la chiave pubblica. – aromero

+1

Un cracker può sostituire la chiave pubblica nella memoria dell'app con il proprio e firmare gli acquisti con la propria chiave privata. Ecco perché Google ti consiglia di offuscare. –

+0

Hai ragione, ho pensato che stavi parlando della chiave stessa. – aromero

0

Se si dispone di un componente server come parte della propria app, è possibile spostare la maggior parte degli elementi della sicurezza, compresa la chiave pubblica, sul proprio server. Sul server, è possibile generare il nonce e verificare l'acquisto (ho spostato il mio su un servizio WCF RESTFul). Se il tuo componente server è basato su .NET, probabilmente dovrai generare un modulo e un esponente dalla tua chiave pubblica in modo da poter utilizzare la classe RNGCryptoServiceProvider. C'è un video di Google I/O che offre una panoramica to In-App Billing tra gli altri.

+0

Cosa intendi per ~ "** modulo e un esponente **? Funziona con la chiave codificata in Base64 per la fatturazione in-app? –

2

Come dice il codice di esempio di Google per la fatturazione in-app, è necessario nascondere questa chiave pubblica.

Invece di memorizzare l'intera stringa letterale qui incorporato nel programma , costruire la chiave in fase di esecuzione da pezzi o manipolazione uso bit (per esempio, XOR con qualche altra stringa) per nascondere chiave effettiva. La chiave in sé non è informazione segreta, ma non lo facciamo per rendere più facile per un utente malintenzionato sostituire la chiave pubblica con uno proprio e quindi falsi messaggi dal server.

Io uso un codice Java molto semplice per generare la classe Java che mi restituirà la chiave pubblica. L'idea di base è usare la ricorsione per ricreare la chiave usando la classe statica interna. È solo spunti di riflessione.

È un approccio "abbastanza buono" per il mio mercato di nicchia.Vedere this stackexchange security question per ulteriori informazioni su offuscamento.

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; 
} 
Problemi correlati