Proteggi l'accesso API API tramite hash nell'applicazione Android

Nell'applicazione Android, l'utente può submit contenuto al database, che può essere visto anche da tutti gli altri utenti.

Questo nuovo contenuto viene inviato al server tramite la richiesta GET:

  • Sempre ottenendo lo stato della session: CLOSED_LOGIN_FAILED, token: {Token AccessToken: ACCESS_TOKEN_REMOVED in facebook android sdk3.0.
  • Come cambiare la lingua dell'app quando l'utente seleziona la lingua?
  • Come fare il contrario dell'attributo di preferenza android: dipendenza?
  • Adb non si avvia
  • Android - come disegnare una lettera in un punto specifico?
  • Il modo migliore per salvare la grande quantità di dati localmente in unity3D android?
  • http://www.example.org/API.php?newContent=helloWorld 

    Il problema è: se un utente scopre cosa sembra questo URL, potrebbe facilmente submit richieste dannose nel suo browser e eludere l'applicazione Android. Forse si potrebbe decompilare l'applicazione e scoprire l'URL.

    Come posso proteggere l'accesso a questo URL e impedire agli utenti di accedere direttamente a questa API?

    È una buona soluzione per generare un hash nell'applicazione e confrontarlo con un hash generato nel file API.php sul server?

    Non è ansible capire come viene generato l'hash quando decompilano l'applicazione?

    Grazie mille in anticipo!

  • Come aggiornare lo schema della tabella dopo un aggiornamento di app su Android?
  • CollapsingToolbarLayout e TabLayout
  • Nascondi MenuItem in alcuni frammenti
  • Qual è il metodo migliore per rendere i frame video?
  • TextInputLayout.setError () lascia spazio vuoto dopo aver eliminato l'errore
  • Mostra la tastiera automaticamente
  • 4 Solutions collect form web for “Proteggi l'accesso API API tramite hash nell'applicazione Android”

    Quindi l'unico modo per proteggere veramente l'URL è richiedere che tutte le richieste siano autenticate.

    Un modo per farlo è modificare la tua richiesta a una richiesta POST e submit una sorta di token di authorization (un semplice hash farà) con la richiesta. Se il token di authorization non è presente, non rispondere semplicemente alla richiesta. L'hash sarebbe qualcosa che potresti codificare sia nel client che nel server.

    Ora la domanda è come hide il tuo token di authentication. Fintanto che non sei aperta per il tuo codice, l'unico modo per accedere a qualcuno sarebbe quello di decompilare il tuo programma come hai detto. Per evitare questo, si potrebbe desiderare di guardare utilizzando proguard (http://developer.android.com/guide/developing/tools/proguard.html).

    Qualcosa da tenere presente è che questo metodo contiene un singolo punto di fallimento. Se il tuo token di authorization è mai stato esposto, sei finito (ad esempio, il debacle chiave crittografica HD DVD AACS).

    Un altro modo per autenticare è su base utente. Fintanto che un utente valido sta facendo una richiesta, non dovresti veramente preoccuparti se la richiesta venisse o less dal browser web o da un'applicazione android. Penso che questo sia un modo molto migliore di fare le cose. In questo modo è ansible controllare le richieste su base utente. Ciò tuttavia richiede di gestire i profili utente e l'integer cane di worm che viene fornito con esso.

    Tutto quello che ha detto, alla fine del giorno anche se non dovresti veramente preoccuparti se qualcuno conosce l'url in una porzione della tua API. Non conosco il tuo caso di utilizzo particolare, ma c'è un modo per progettare la tua API in modo che non ti interessa come stai ricevendo le tue richieste. Inoltre, se il tuo fare un vero GET, allora non dovresti cambiare nulla sul server. Ciò significa che tutta la "persona maligna" può fare è get dati fuori di esso. Questo limita gravemente i danni che possono fare. Infatti, a less che non si dispone di dati sensibili che non si desidera che alcune persone guardino, non si ha davvero alcun problema. Se lo fai, allora dovresti davvero pensare alla mia soluzione di authentication per utente.

    Non fidatevi del client per la validation. Questo è vero se il suo javascript in un browser web o anche qualche piattaforma bloccata come l'Iphone.

    Se l'applicazione può effettuare chiamate API, chiaramente tutto ciò che serve per effettuare tali chiamate è sul telefono (segreto, function hash, tasto API, qualunque cosa), quindi qualcuno può sempre scaricare la memory del telefono e get tutti i dati. Possono quindi fare qualsiasi richiesta che vogliono.

    Quello che vuoi fare è autenticare l'utente e quindi validationre l'input sul lato server.

    Utilizza SSL (HTTPS) per i tuoi trasferimenti dati. Lo scambio è crittografato prima di submit tutti i dati, in modo che chiunque ascolta non sarà in grado di vedere né l'URL né i dati inviati al server. Per verificare questo per te, installa Wireshark sul tuo sistema di dev e carica l'URL in un browser. Non verranno visualizzati dati chiari (l'URL oi dati inviati tramite GET o POST).

    È ansible utilizzare un metodo java in qualche modo confusionale per ignorare each lettera dell'URL. Quindi tipo di creare il proprio dictionary in modo che potrebbe rendere l'URL ansible 123.3 * 15 * 13 o qualcosa del genere se qualcuno ha decompilato l'APK, non avrebbero idea. E su quella nota, preferirebbe usare Proguard per offuscare, in modo che il tuo obfuscio non avrebbe senso a qualcuno che cerca di invertire l'ingegnere.

    Potresti fare un breve metodo java come questo:

     public String confuseString() { Stringbuilder sb = new StringBuilder(); //your real URL would be abc.com, but in the app you have myURL = 123.3*15*13 //With what I'm saying the * would precede a 2 digit number that represents 1 letter for (int i = 0; i < stringLength; i++){ String letter = myURL.charAt(i); if (letter.equals("1"){ letter = a; sb.append(letter); } // you would go one to code each character into a letter } } 

    Ci sarebbero diverse altre dichiarazioni ovviamente, ma ti permetterebbero di ingannare il tuo url senza apportre modifiche sul lato server. E se utilizzi Proguard, allora l'integer metodo che hai creato non avrebbe assolutamente senso a qualcuno che cerca di invertire l'ingegnere.

    Potresti naturalmente rendere il tuo obfuscio molto più complicato di quello che ho suggerito, ma è comunque un'idea.

    Fondamentalmente si sarebbe crittografare l'URL in modo molto confuso.

    Ecco una risposta che potrebbe essere un metodo migliore di crittografia o alless dare una crittografia aggiuntiva:

    Java – crittografare / decifrare il nome utente e la password da un file di configuration

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.