2012-12-29 13 views
11

Ho completato lo sviluppo della mia app che utilizza nella fatturazione delle app v3. La mia app è un'app di aiuto per gli esami che contiene un elenco di domande che vengono inserite in un database. La cosa che mi preoccupa è la sicurezza in quanto al di là di proguard non c'è praticamente altro. La mia app interroga l'inventario degli articoli acquistati, quindi l'archiviazione degli acquisti non è un problema.Nella sicurezza della fatturazione delle app

Quindi il primo problema è che qualcuno potrebbe decompilare l'app (cosa che ho fatto) e anche con proguard è possibile senza troppe difficoltà recuperare tutte le domande.

La prossima cosa è la chiave pubblica dell'applicazione. Questo può essere facilmente preso dalla mia app e secondo la guida degli sviluppatori, questo è qualcosa che dovrei tenere al sicuro.

Tuttavia, non so davvero come implementare alcuna forma di sicurezza. O anche fino a che punto dovrei andare con la sicurezza. Senza un server, se tengo tutto sul dispositivo, riconosco che non sarà perfetto (lontano da esso) ma vorrei almeno che gli hacker siano scoraggiati piuttosto che divertiti.

Quindi, in sostanza la domanda è:

Che tipo di sicurezza devo usare e come si usa? Mi sta solo indicando i collegamenti che lo attraversano passo dopo passo, così posso capire che sarebbe fantastico.

Grazie mille!

Chiarimento:

Nessun server coinvolto. I dati sono memorizzati nell'app. Quando l'inventario viene interrogato (tramite il metodo queryinventoryasync) ritorna indietro se viene acquistato o meno un inventario e questo viene eseguito ogni volta che l'app viene avviata. Nella fatturazione delle app stessa presumo che vada bene, sto chiedendo di più sulla mia applicazione, la chiave pubblica dell'applicazione - ho intenzione di renderla in qualche modo più difficile da copiare, ma al momento l'ho appena spezzata in 15 stringhe e ho solo "aggiunto" loro a vicenda in fase di runtime, ma è appena meglio che averlo solo come una stringa. Mi piacerebbe crittografarlo in qualche modo solo non so come.

+0

http://stackoverflow.com/questions/14352758/android-in-app-billing-securing-application-public-key – Krishnabhadra

risposta

18

Buona domanda.

La chiave pubblica deve essere disponibile sul dispositivo per poter essere utilizzata. Una volta sul dispositivo non è più protetto. La chiave in sé non è un segreto, ma dobbiamo rendere la sua possibile sostituzione un compito più difficile.

Quello che puoi fare è usare la cosiddetta crittografia XOR. Ecco un esempio dei metodi di crittografia e decrittografia XOR.

public static String xorEncrypt(String input, String key) { 
    byte[] inputBytes = input.getBytes(); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(Base64.encode(outBytes, Base64.DEFAULT)); 
} 

public static String xorDecrypt(String input, String key) { 
    byte[] inputBytes = Base64.decode(input, Base64.DEFAULT); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(outBytes); 
} 

Come ciò che è necessario è quello di scegliere una stringa password (String key) e crittografare la chiave pubblica (String input) utilizzarlo. Questa chiave crittografata è possibile memorizzare in una classe. Quando hai bisogno del tuo valore chiave reale, chiami xorDecrypt() con la password e la stringa di chiave pubblica (crittografata). La password è una stringa che memorizzi da qualche parte nel tuo codice. Come ho detto, non lo proteggiamo veramente, ma lo rendiamo più difficile da trovare e/o sostituire.

È possibile aggiungere una logica più sofisticata su come combinare anche la chiave pubblica e la password crittografate. Questo aggiunge solo più complessità ma non ti darà alcuna garanzia che la tua chiave non sarà decifrata. In ogni caso la crittografia XORè meglio di niente.

Android 4.3 ha aggiunto ulteriori funzionalità di sicurezza che possono essere utilizzate anche per memorizzare le chiavi pubbliche. Questa soluzione richiederà una comunicazione server e supporto hardware per essere veramente sicuri. Questi sono Key Chain enhancements and Android Keystore Provider.

+0

Risposta eccezionale. Inoltre dovrei suddividere la mia chiave pubblica criptata in varie parti che unisco insieme per invertire le stringhe e mescolare i personaggi? Quello che capisco è che l'idea è di fermare qualcuno che sostituisca la propria chiave con la propria, in modo da deviare il denaro guadagnato dall'acquisto di oggetti sul proprio conto. – AndroidPenguin

+1

Grazie! a) Sì, puoi anche rompere la tua chiave pubblica criptata in alcune parti. Ciò renderà la vita degli hacker più difficile ... o forse più interessante per loro. b) Non proprio. L'idea è rendere più difficile la sostituzione della tua chiave pubblica con una falsa. Quindi riassembla la tua app, che inizia ad accettare false risposte del server. Quindi gli hacker possono abilitare la funzione senza pagare per loro. –

+0

'int keySize = keyBytes.length - 1;' questo non è necessario i% keySize sempre inferiore a keySize, quindi non è necessario ridurre keySize per 1 –

Problemi correlati