Implementazione (sicura) delle chiavi Api in un'app

Ho scritto un'applicazione Web e vorrei consentire ad altri sviluppatori di get le informazioni da esso.

Il server su cui sto lavorando non è così bello e non può gestire molte richieste, quindi l'idea è di generare e assegnare le chiavi API a chiunque voglia interrogare le nostre informazioni. Con le chiavi Api posso limitare le richieste giornaliere e forse raccogliere alcune statistiche per vedere quali informazioni sono davvero utili per gli altri sviluppatori.

Il fatto è che sono preoccupato per l'aspetto della sicurezza. Dato che la chiave Api verrà inviata al nostro server (tramite GET / POST, ecc.), Qualcuno potrebbe annusare la richiesta con wireshark e get la chiave API degli sviluppatori senza molto sforzo, giusto?

Ho pensato di generare una chiave segreta e una chiave API. Potrei quindi istruire gli altri sviluppatori a concatenarli e inviarne un hash alla nostra API. Quindi convaliderei che l'hash è valido e consentire la richiesta … Ma poi lo stesso problema persisterà. Un hacker potrebbe ancora annusare quell'hash e inoltrare richieste per conto dell'app degli altri sviluppatori.

Quindi le mie domande sono

  • Come posso evitare questo problema?
  • O meglio ancora, la mia preoccupazione è valida? È un vero problema?
  • C'è un modo migliore e sicuro per consentire l'accesso alle mie informazioni senza renderlo troppo complicato per gli altri sviluppatori?

Che cosa ne pensate?

Penso che tu stia cercando di risolvere un sacco di domande diverse qui.

Se il tuo objective è limitare il numero di richieste al tuo server, dovresti creare un meccanismo di limitazione. Questo non è banale, ma lo baserei su un indirizzo IP piuttosto che su una chiave di licenza: un singolo utente con licenza potrebbe sommergere il tuo sistema con molte richieste. È ansible limitare l'indirizzo IP senza implementare un meccanismo di licenza.

Se si desidera creare uno schema di licenza, è necessario comprendere la crittografia, ecc. È un problema non banale. Ad esempio, come fermi un utente legittimo che condivide la chiave di licenza con tutti i loro amici? Come fai a impedire a un hacker di rubare la tua chiave e condividerla con tutti i suoi amici?

Ci sono un certo numero di soluzioni a questo – tutti impongono un certo grado di dolore ai tuoi utenti. Ad esempio, puoi eseguire il tuo servizio su HTTPS; questo smette di snooping, ma riduce le performance. Puoi emettere "token" per il tuo servizio che scadono dopo un certo numero di utilizzi; get nuovi token richiede uno scambio crittografico (che potrebbe controllare il tuo indirizzo IP). Potrebbe essere necessario un tipo di logica "challenge / response" (inclusa una validation dell'indirizzo IP). Tutti questi passaggi rendono la vita più difficile per i tuoi utenti; probabilmente non ti ringrazieranno molto per il lavoro extra che devono fare.

Per quanto riguarda lo sniff, il problema può essere risolto con HTTPS sul server.

ha sicuramente senso mettere un po 'di authentication sull'API se vuoi limitare l'accesso + potenziale alcuni limiti di velocità d'uso. Se si utilizza una chiave API e si desidera evitare lo sniffing, HTTPS è sicuramente la scelta giusta. Se questa non è un'opzione, puoi anche utilizzare un'authentication in stile hash come oAuth 1.0 (http://oauth.net/core/1.0/) o l'authentication Amazon AWS. Questi funzionano pubblicando i tuoi utenti API con un ID e un segreto. Usano il segreto sul lato client inserendolo nel corpo del messaggio, calcolando un hash e includendo l'hash (non il segreto) nella richiesta. Sul lato in entrata si confronta l'hash con la stessa operazione eseguita sul contenuto del messaggio con il proprio segreto specifico incluso.

Ciò significa che è ansible verificare il mittente senza wherer submit il segreto sul filo (si noti che il contenuto non è ancora sicuro, ma si evita di passare la chiave sul filo ad each richiesta). Il lato negativo è che è complesso da implementare per gli sviluppatori. Anche se utilizzi il pattern oAuth 1.0 che contiene librerie, è un po 'un overhead.

Io lavoro su 3scale e alcuni dei nostri strumenti potrebbero essere utili anche – i nostri sisthemes forniscono API Keys, condivisione OAuth Secret e anche limiti di velocità API fuori dalla scatola (http://www.3scale.net e le librerie PHP sono qui: https : //github.com/3scale/3scale_ws_api_for_php ).