2012-08-06 6 views
5

Quindi sto lavorando a un'app mobile in questo momento che effettuerà richieste a un'API REST costruita con Django.Come posso condividere la chiave segreta della mia app mobile con il server la prima volta che la creo?

Al fine di proteggere l'API, ho intenzione di utilizzare un sistema di autenticazione della coppia di chiavi privata/pubblica.

Il flusso di lavoro che ho pensato più o meno così:

  1. L'utente accede a utilizzare Facebook
  2. Una volta che l'utente firma l'applicazione genera una chiave
  3. La chiave privata privata è condivisa tra la server e l'app in modo che il server sappia mappare quella chiave privata a un utente specifico.
  4. Ogni volta che l'app mobile effettua una richiesta, l'app genera un HMAC/firma utilizzando i parametri di richiesta e la chiave privata. Oltre all'HMAC, l'app invia anche user_id dell'utente che l'ha inviata (che fungerà da chiave pubblica).
  5. Quando il server riceve la richiesta, genera il proprio HMAC. Prende user_id e cerca la chiave privata in una tabella. Utilizzando la chiave privata, ricrea l'HMAC con i parametri della richiesta e la confronta con l'HMAC che l'app mobile ha inviato. Se il server e il cellulare hanno HMAC corrispondenti, allora esegue la richiesta.

Ora il mio problema si trova nel passaggio 3 in cui la chiave privata deve in qualche modo essere condivisa tra l'app mobile e il server. Come posso inviare in modo sicuro la chiave privata?

risposta

4

Vorrei iniziare chiedendo perché la parte server dell'app deve conoscere la chiave privata. Se vuole solo autenticare un utente, ha solo bisogno della chiave pubblica e dell'ID utente e l'ID utente non può essere la chiave pubblica (è necessario un modo per scoprire quale chiave pubblica utilizzare).

Ad esempio, il processo di condivisione della chiave, il vostro punto tre, potrebbe essere simile a questa:

  1. L'applicazione genera una coppia di chiavi pubblica-privata.
  2. L'app invia la chiave pubblica al server, senza preoccuparsi di chi può intercettarlo.
  3. Il server memorizza quella chiave pubblica, associandola all'ID fornito dall'utente.

Forse l'integrazione in Facebook è la parte che lo rende impossibile. Non capisco perfettamente come Facebook entri in questo intero processo.

Una cosa che può rendere il trasferimento di una chiave un po 'più sicuro è usare più canali per trasferirlo.

Ad esempio, l'applicazione potrebbe inviare la chiave privata che è stata generata utilizzando l'API REST ma crittografandola con uno schema di crittografia simmetrica. La chiave di crittografia simmetrica può essere inviata tramite un altro mezzo, come l'e-mail o tramite SMS poiché si tratta di un'app mobile o forse anche di una chiamata telefonica automatizzata posta a un numero fornito dall'utente che effettua la registrazione. La chiave può essere una passphrase casuale che genera la chiave di crittografia simmetrica effettiva, per assicurarsi che sia qualcosa che può essere digitato dall'utente. Quindi, per sbloccare l'app, l'utente deve digitare questa passphrase in una schermata e la chiave segreta è sbloccata.

Ancora una volta, questo migliora solo la sicurezza del trasferimento con un piccolo margine, soprattutto considerando il fatto che se è possibile intercettare la trasmissione della chiave privata, probabilmente si può intercettare l'e-mail contenente la passphrase. A mio avviso, non inviare la chiave privata al server non sarebbe solo ottimale ma richiesto.

Problemi correlati