2009-09-09 17 views
7

Sto sviluppando un'applicazione che si collega a un'API basata su XML. Ho il controllo sia del server che dell'app: c'è un modo per assicurarmi che solo l'app possa accedere all'API?Comunicazione sicura tra iPhone e server?

Non c'è autenticazione utente.

EDIT:

La preoccupazione principale è che i bot rubare i dati attraverso la scansione del XML.

ne dite di questo:

Chiedo una sessione con l'UDID del dispositivo e ottengo una chiave stretta di mano.

<handshake>23354</handshake> 

da questa stringa una password viene calcolato sia sul server e il client secondo un algoritmo concordato (si deve solo essere difficile da ricostruire)

Diciamo per ora che aggiungo 1 al tasto handshake

password = 23354 

Su tutte le chiamate API, quindi passo questa password con l'UDID. Ciò consentirebbe al server di limitare ogni sessione a un certo numero di chiamate, no?

Cosa ne pensi?

risposta

2

È possibile fornire un meccanismo di risposta rapida, presupponendo che si abbia il controllo dell'API XML.

Generare un numero e includerlo nell'app e sul lato server. Usalo come seed su srand() su client e server.

Avere la richiesta da parte del cliente comprendono qualcosa come:

<handshake id="123">12312931</handshake> 

ci id indica il 123'rd generato numeri casuali e 12.312.931 è il valore dopo la chiamata rand() 123 volte. Il valore 123 dovrebbe essere un numero generato casualmente (generato con un seme diverso!) Pure.

Questa non è una risposta alla sfida infallibile, ma è semplice ed efficiente e non si basa su nulla più di un set di librerie ANSI C di base.

Nota che non è nemmeno terribilmente sicuro - tutto ciò che si deve fare è far sì che il client sfidi il proprio server, quindi generare (in questo esempio) 123 ° numero casuale per ogni valore seme fino a quando non lo trovano. Quindi non lo userei aspettandosi che fornisca l'autenticazione a livello di crittografia o il controllo degli accessi. Fornisce solo una semplice risposta a una sfida non banale che è efficiente e semplice da implementare.

+0

Non credo ci sia alcuna promessa che la sequenza restituita da rand() sia la stessa da piattaforma a piattaforma. POSIX non sembra definire l'algoritmo attuale, ma solo i requisiti minimi. Suppongo in quanto sopra il server sceglie "123". Se il cliente lo sceglie, questo non fornisce alcuna sicurezza (nemmeno una sicurezza insignificante). Se il server invia id, ci sono rotture più veloci del calcolo di tutti i valori per 64k semi. Più ovvio è il MiM della sessione. Posso anche trovare il seme molto più velocemente sfidando il client con id = 1, quindi id = 2 per le poche collisioni. –

0

Accedi al servizio web tramite https con autenticazione.

+0

Sì, ma come? Cercando di capirlo su iPhone. Quali classi stai usando per questo? – Spanky

3

No, non è possibile garantire che solo la tua app possa contattare il tuo server. Esistono tecniche di offuscamento per alzare l'asticella in qualche modo sugli attaccanti e quelle funzioneranno per la maggior parte degli attaccanti. Il tuo problema di fondo non è risolvibile per un aggressore dedicato. È possibile trovare un elenco di altri post su questo argomento allo iPhone: How to encrypt a string. Esistono diverse tecniche che puoi utilizzare in quei post e alcune discussioni su come e se dovresti attaccare i problemi sottostanti.

1

È possibile utilizzare una sorta di firma per verificare che sia effettivamente l'app che effettua la chiamata, si calcola la firma sia lato server che lato app, solo se corrispondono corrisponderà al servizio restituito con una risposta alla richiesta . Tipicamente le firme sono composte da alcuni parametri della tua funzione seguiti da una chiave segreta, quindi prendono l'hash MD5 di quello e lo fanno passare. Nel r equesto nessuno potrà trovare la chiave segreta perché è nell'hash md5.

+0

Sfortunatamente la chiave segreta deve essere codificata nel tuo programma, che devi quindi dare agli utenti. Un utente malintenzionato eseguirà il reverse engineering della chiave segreta dall'eseguibile (o dalla memoria esaurita in un debugger) e quindi lo utilizzerà per connettersi al server. O modificherà il tuo programma per fare ciò che desidera, e lascerà che il tuo programma gestisca l'handshake segreta per lui. Questa è una forma di offuscamento, ma non risolverà il problema se hai qualche tipo di attaccante dedicato. –

-2

Penso che la vera domanda che devi porre sia quanto i tuoi dati sono a rischio di attacco. Direi il 99% delle volte che starai bene solo con un URL offuscato che sarà difficile da indovinare, dal momento che le probabilità che l'utente medio tenti di fare qualcosa al di fuori della tua app sono scarse. Se sei preoccupato per la concorrenza che ti ruba, ti suggerisco qualcosa di più nefasto:

Nella tua app, configurala in modo che l'app e il server cambino gli URL ogni tanto, forse ogni due settimane. Quindi, se qualcuno tenta di accedere alla tua API XML, combatterà una battaglia costante per capire i tuoi URL. E come ciliegina sulla torta, mantieni attivi i vecchi URL ma restituisci loro dati errati. Penso che puoi lasciare correre la tua immaginazione e capire il resto da qui.

+0

In che modo l'app determina quale sarà l'URL corretto? Qualunque sia la tecnica che usa può essere duplicata da chiunque inversori l'app. Allo stesso modo, semplicemente annusando il traffico dell'app legittima dirà all'app canaglia dove connettersi. Questa soluzione è complicata da implementare senza impatto sugli utenti legittimi (che potrebbero avere problemi durante ogni transizione), ma è solo un'altra versione di un segreto condiviso, tranne che questo segreto non è nemmeno crittografato sul filo (poiché l'URL non può essere) . –

+0

Questa non è una risposta utile in quanto non risponde affatto alla loro domanda. Inoltre, non fornisci alcun meccanismo reale per fare ciò che suggerisci. – Ryan