2011-10-31 15 views
7

Ho una routine di crittografia e decrittografia mcrypt all'interno di una delle mie app Android. Questo è essenzialmente decifrare una stringa che viene recuperata tramite. chiamata remota. Naturalmente la "chiave segreta" è memorizzata all'interno del codice, ma chiunque abbia apktool può ovviamente vedere il codice e vedere la mia chiave segreta.Mantenere la chiave segreta SEGRETO - all'interno di un'app Android .. qualsiasi idea

Esiste comunque la possibilità di crittografare tutto il codice Java in modo che, anche se non fosse stato compilato, non sarebbe leggibile/comprensibile?

Ho sentito parlare di ProGuard, ma dalla lettura a riguardo, non mi sembra sufficiente per questo scopo.

+2

La domanda è: perché la stringa è crittografata? Se è per il trasporto e la sicurezza di archiviazione del server, utilizzare la crittografia a chiave pubblica. Se vuoi "nasconderlo" agli utenti, non sei fortunato dato che tutto ciò che la tua applicazione può "vedere" può farlo anche agli utenti. –

+0

La stringa è crittografata per nascondere la posizione di un file che è in streaming - l'intenzione è di offuscare e rendere meno difficile per gli utenti occasionali/script kiddie di scaricare l'mp3 indipendentemente dall'app. So cosa stai dicendo e capisco che tutto ciò che l'app può vedere - chiunque sia sufficientemente determinato può eseguire il debug, decodificare o decompilare - sto solo cercando di renderlo più difficile. Qualcuno determinato continuerà comunque a fare tutto ciò e riuscirà. No biggie .. basta tenere fuori i kiddie di script in sostanza .. – SpacialWise

+2

Perché non avere il client generare la coppia di chiavi e inviare la sua chiave pubblica al server con la richiesta? –

risposta

4

Non si dovrebbe mai inserire una chiave segreta nel codice. Il codice compilato può essere facilmente decodificato e chiunque abbia un debugger può collegarsi al punto in cui viene creata la chiave effettiva. La sicurezza si basa sempre sull'algoritmo, si presume che il codice client sia pubblico e che un potenziale utente malintenzionato abbia una copia.

Nascondere i letterali nel codice ritarda l'aggressore nel processo di acquisizione della chiave, ma non lo impedisce in alcun modo.

+0

Quindi, quali sono i tuoi consigli? – SpacialWise

+0

Potrebbe esserci una schermata di configurazione in modo che l'utente sia in grado di definire il proprio psw. Quindi memorizzi un hash del pasticcio usr, e quando l'app si avvia, viene richiesto il psw. Se l'hash di psw corrisponde all'hash memorizzato, allora concedi l'accesso all'utente. Puoi anche inviare le chiavi agli utenti, archiviare gli hash nel tuo DB e consentire loro di convalidare la loro app al primo utilizzo online. –

0

Io non sono un esperto di sicurezza, ma so che il linguaggio compilato dalla VM può essere facilmente decompilato puoi provare a nascondere il codice usando ProGuard ma comunque essere leggibile, cosa consiglierei di provare a salvarlo e crypt tuo chiave utilizzando Java Crypto, questo tipo di domanda è stato chiesto prima simile a Android Crypting Database o Encrypt Information in Android, non mi aspetto di rispondere alla tua domanda, ma ti do una linea guida dove andare da ora.

+0

Grazie, Necronet. Ho letto diversi post qui senza una soluzione definitiva. Controllerò quelli che hai collegato. – SpacialWise

0

si può invece generare una nuova chiave ogni volta che è necessario recuperare la stringa

avrete quindi bisogno di fare uno scambio di chiavi con un certificato hardcoded (che è sicuro, se correttamente attuato)

o semplicemente utilizzare SSL se è solo per proteggere durante il trasporto

+1

Questo approccio sembra plausibile. Generare una nuova chiave ogni volta è fattibile, ma non ho familiarità con lo scambio di chiavi con un certificato hardcoded. Potresti approfondire ulteriormente o indicarmi una direzione? I ' – SpacialWise

1

È possibile leggere tutto il codice sul computer client. Il meglio che puoi fare è rendere più difficile la ricerca della chiave.

Un suggerimento: ci saranno alcune stringhe di testo nel tuo codice, come "Attendi mentre la tua richiesta è in elaborazione ..." Trova questo messaggio e genera un array di byte per cambiare quel messaggio nella tua vera chiave con XORing l'array di byte con la stringa di testo.

ad es. "scoiattolo" XOR [16 1D 10 19 1A 13 0B 18] => "elefante"

Solo "scoiattolo" e l'array di byte appaiono effettivamente nel codice.

+0

Ciao! Sì, questo è in linea con ciò che pensavo inizialmente. Essenzialmente alcune routine (che utilizzano algoritmi) che creano la chiave fuori dai dati all'interno di string.xml e anche alcune altre variabili incorporate casualmente. Combinando tutto questo in diversi metodi incorporati in classi separate. Poi finalmente usando ProGuard che renderebbe la traccia di quali funzioni/routine specifiche stiano facendo più difficili .. – SpacialWise

+0

So che qualcuno potrebbe ancora capirlo anche in quell'istanza, ma è un po 'più dispendioso in termini di tempo - prendendolo dalla semplice decompilazione e lettura, a dover tracciare il codice per alcuni minuti. – SpacialWise

Problemi correlati