2015-04-16 19 views
8

Quando si compila un file .java in un file .class, se si ha una linea comeCome impedire alle persone di visualizzare stringhe letterali in file di classe compilati?

String s = "This is a String" 

Se si apre il file .class in un editor di testo, vedrete

This is a String 

Da qualche parte nel file in mezzo al gobblety gook.

Che va bene e dandy per la maggior parte delle cose, ma non quando si tratta di informazioni sensibili come le chiavi API.

Ovviamente, un'alternativa è leggere la chiave API da un altro file, ma ciò rende SEMPLICE FACILE trovare la chiave, poiché ora la persona può semplicemente aprire "key.txt" quando apre il file .jar .

Quindi, come si crittografa una stringa letterale nel file .class?

+1

Il modo più comodo sarebbe quello di rimuovere qualsiasi informazione sensibile dal codice e memorizzarla in un repository (possibilmente crittografato) di qualche tipo. – Rouby

+0

Ho lo stesso problema - quando decompro altre app (apk Android) questa è la prima cosa da cercare e che in realtà porta a decodificare l'apk e capire il codice decompilato –

risposta

0

Anche se si mantengono tali informazioni crittografate nella classe, un hacker può trovare il meccanismo per decodificarlo solo dal proprio codice. Quindi IMHO è meglio mantenere le informazioni crittografate in qualche altro file e leggere quel file. Inoltre, limitare l'accesso a quel file utilizzando i meccanismi di sicurezza del sistema operativo.

1

Se si archiviano le informazioni nel file di classe, la chiave di decodifica dovrebbe provenire dall'esterno della classe. Puoi criptare i dati, ma se hai tutte le informazioni all'interno del file di classe, sei perso.

È necessario memorizzare le chiavi API nei file di configurazione. Hai una chiave API diversa per lo sviluppo e per il live, giusto?

Un'altra soluzione possibile è utilizzare KeyStore, che consente di memorizzare informazioni riservate in formato accessibile al pubblico. Solo il detentore della chiave segreta può decrittografare i dati sensibili.

+0

Avrò una chiave di rilascio quando Riot approverà l'app, per ora no, ma la mia attuale chiave API non è in grado di gestire l'uso di massa in ogni caso. : P In entrambi i casi, la chiave API e la chiave di crittografia finirebbero entrambe nello stesso file .jar quando un utente lo esegue sul proprio computer, anche se si trovavano in file diversi all'interno del contenitore. – CSDragon

6

Quando si invia il codice a una terza parte, si perde il controllo su di esso. Anche se tu dovessi incorporare la chiave API come stringa crittografata, un utente malintenzionato potrebbe comunque tentare e potenzialmente riuscire a infrangerlo, il che renderebbe vani tutti i tuoi sforzi di crittografia/decrittografia.

La soluzione migliore, a mio parere, sarebbe quella di non fornire informazioni sensibili all'interno dell'applicazione, ma piuttosto di fornire un ID di qualche tipo. Qualsiasi valore sensibile di cui ha bisogno verrà quindi utilizzato attraverso una connessione sicura.

4

Se si utilizza una chiave per accedere a un'API di terze parti, non è possibile proteggere quella chiave dall'utente finale SE lo spedisci con il tuo codice/applicazione o desideri che la tua applicazione sia in grado di accedere alla terza parte API senza intermediari.

L'utente finale può solo leggere tutti i dati inviati dall'app al punto finale e conoscere la chiave API. Indipendentemente dalle misure che hai preso per crittografarlo, dovrai inviarlo almeno una volta decrittografato alla terza parte.

Il modo sicuro per fare ciò è richiedere all'utente di accedere a un servizio fornito da te, inviare una richiesta al tuo servizio e quindi al tuo servizio (che presumibilmente non si trova sulla macchina dell'utente finale) invia una richiesta all'API con la chiave. Quindi l'utente finale non conosce mai la chiave.