servizi web: come impedire accessi illegali

5

Come suggerito da qualcuno, posto una domanda qui (per la prima volta). Sto usando i servizi web da un'applicazione Android. Io uso https (ho comprato un certificato SSL).

Voglio impedire accessi indesiderati da parte di altri che conoscono le url dei miei servizi web.

Uso una "chiave segreta" che l'app deve fornire al metodo del servizio web, ma è memorizzata in una variabile costante all'interno del codice e so che questa non è la soluzione migliore per garantire la sicurezza.

Qual è il modo migliore per ottenere la soluzione definitiva?

    
posta Seraphim's host 13.02.2013 - 16:39
fonte

3 risposte

8

Devi definire con alta precisione che cosa vuoi esattamente .

Qui, vuoi consentire gli accessi da te, personalmente. L'azienda con la chiave segreta significa che l'accesso sarà concesso a chiunque / qualunque sia a conoscenza della chiave segreta . Incorporare la chiave nell'applicazione significa che l'applicazione conosce la chiave, non tu; e, come noti, i segreti incorporati in un'applicazione ampiamente pubblicata non sono davvero segreti.

Quindi, devi essere chiaro con te stesso. Prima di tutto, definisci a chi dovrebbe essere concesso l'accesso e da "chi" intendo "gli umani". Ogni essere umano in questo set dovrebbe "conoscere" un valore segreto che viene utilizzato dal server per autenticare il suddetto umano. Se diversi umani usano lo stesso valore segreto, la gestione di questo segreto diventa complessa, perché non puoi imporre l'oblio: non puoi sfrattare un utente dal gruppo di persone che "conoscono il segreto" perché lo ricorderà comunque.

Pertanto, dovresti avere segreti specifici dell'utente. Ogni umano dovrebbe avere il suo valore segreto e inviarlo al server per avere accesso (dal momento che stiamo parlando di inviare segreti su una rete, presumo che tutto ciò avvenga sotto l'egida di SSL). Poi arriva la domanda su come tecnicamente un utente memorizzerà il suo valore segreto. Se lo memorizza nella sua testa e lo rende disponibile all'applicazione che usa digitandolo quando richiesto, questo segreto è una password . Ma altri modelli sono possibili, ad es. il segreto potrebbe essere un mucchio di byte generati casualmente che l'utente memorizza in un file lungo la sua app.

Non puoi impedire a un utente che ha accesso al tuo server di "condividere" quell'accesso con qualcun altro; ma con i segreti specifici dell'utente puoi almeno:

  1. sapere sul server che è (presumibilmente) connesso, e quindi modulare il set di operazioni che il server consentirà o disabiliterà;
  2. sfrattare gli utenti specifici rimuovendo il lato server segreto, senza influire sugli altri utenti.

Ciò che non puoi fare è avere un'app che chiunque nel mondo possa scaricare, installare e utilizzare per accedere al tuo server, impedendo in modo affidabile qualsiasi accesso che non abbia utilizzato l'app esatta che hai pubblicato . Questo sarebbe il Santo Graal della prevenzione della pirateria, e si dimostra sfuggente come la sua controparte teologica.

    
risposta data 13.02.2013 - 17:00
fonte
3

Come ripresentare la tua domanda.

Hai un'applicazione mobile installata sul telefono di un client non affidabile.

L'applicazione mobile deve recuperare / inviare dati al tuo servizio web; tuttavia, si desidera limitare l'accesso al proprio servizio Web solo alle applicazioni mobili, non a qualsiasi utente casuale (che potrebbe utilizzare un dispositivo desktop, pubblicarlo sul Web).

La tua soluzione attuale è quella di codificare una chiave segreta all'interno dell'applicazione, che viene passata al servizio web con ogni richiesta: solo le richieste con la chiave segreta corretta vengono elaborate.

La soluzione perfetta è irrealizzabile

In primo luogo, il tuo obiettivo non è fattibile contro attaccanti sofisticati. Saranno in grado di decompilare il codice byte della tua applicazione Android, vedere cosa sta facendo la tua applicazione, e poi fare qualunque cosa l'applicazione non sia in linea.

Tuttavia, potresti essere in grado di utilizzare la licenza per le applicazioni Android per fare principalmente cosa tu vuoi.

Fondamentalmente è possibile generare un ID univoco per la propria applicazione al momento della prima installazione. Quindi la tua domanda invia una query a "Market License Server" di google play che controlla che l'utente abbia acquistato l'applicazione per questo dispositivo e restituisca uno stato di licenza (crittografato con il certificato di google). La tua applicazione restituisce questo stato di licenza firmato al tuo server, che lo verifica e genera una chiave segreta (legata all'ID univoco) per quel dispositivo.

Ora se alcune applicazioni utilizzano il tuo servizio web troppo frequentemente (ad esempio, ritieni che sia offline), puoi vietarne la chiave segreta unica.

    
risposta data 13.02.2013 - 17:14
fonte
2

Gli utenti devono accedere all'applicazione? In tal caso, è possibile utilizzare le credenziali per convalidare le richieste. In caso contrario, avere una sorta di segreto condiviso tra l'applicazione e il servizio web è praticamente il meglio che puoi fare.

    
risposta data 13.02.2013 - 16:53
fonte

Leggi altre domande sui tag