Come archiviare in modo sicuro i dati sensibili sull'applicazione mobile?

4

Desidero sviluppare un'app mobile bank (Windows Phone, Android, iOS) che interagisca con un canale bancario.

La prima volta che l'utente apre l'applicazione inizia il processo di scambio delle chiavi e alla fine di questo processo viene generato un SymmetricKey a lungo termine che deve essere archiviato nel dispositivo mobile. Tutta la richiesta che invia al server criptare con questa chiave. Se qualcuno può rubare il SymmetricKey lui / lei può dirottare la sessione utente. In modo semplice posso memorizzare SymmetricKey in formato di testo normale. un'altra soluzione è quella di definire un MasterKey in Codice (Hardcode) e criptare il SymmetricKey con MasterKey . ma in questa soluzione esiste esattamente un MasterKey per diverse istanze di app che si installano su dispositivi diversi. Se qualcuno può decompilare il codice dell'app mobile e recuperare MasterKey lui / lei può recuperare SymmetricKey Di nuovo, qual è la soluzione migliore per i dati sensibili in negozio nell'applicazione mobile?

Ho letto di un metodo che appartiene al sistema operativo mobile che garantisce che i dati siano archiviati in modo sicuro, ma tutti hanno bisogno di impostare l'account profilo dell'utente (es .: Protect() e Unprotect() in Windows Phone che necessita di un account Hotmail per essere set).

Posso generare diverse chiavi master per dispositivo diverso?

    
posta Soheil Ghahremani 26.11.2014 - 12:27
fonte

3 risposte

7

Usa semplicemente TLS, è ciò che è stato pensato per: inviare dati in modo sicuro tra due parti attraverso un canale non attendibile.

Se desideri una protezione aggiuntiva, ci sono due modi per risolvere questo problema che mi viene in mente:

  • Utilizza una password per crittografare la chiave simmetrica
  • Utilizza un token come OTT tramite SMS o generato utilizzando una smartcard e un lettore di schede esterno con una richiesta / risposta

La prima opzione proteggerà con password la chiave simmetrica, l'effetto collaterale è che l'unico modo sicuro per implementare questo è che la password viene salvata temporaneamente solo in memoria. Questo richiederà all'utente di inserire la sua password per decodificare la chiave simmetrica ogni volta che il tuo programma richiede di usarla.

La seconda opzione è ciò che ho visto implementato molte volte e non richiede la memorizzazione di una chiave sul dispositivo. Usano la carta bank accountunts e un lettore di carte esterno. È possibile generare un lato server di prova e inviarlo su TLS (non dimenticare il pinning del certificato!) Per l'utente. L'utente inserisce la sfida nel lettore di carte che genera una risposta. Il client invia quindi la risposta al server che può essere verificata dal server.

Ricorda che è tutta una questione di valutazione del rischio , la probabilità che qualcuno sia in grado o di voler arrivare fino in fondo per ottenere la valutazione dell'app mobile. Come prima raccomandazione assicurati di compilare i controlli per verificare se il dispositivo è root / jailbroken o meno. Se ritieni che il telefono sia jailbroken semplicemente non consentire l'utilizzo della tua app e assicurati di inserire nei termini e nelle condizioni che il rischio di perdita di denaro è responsabilità del cliente quando si utilizzano dispositivi jailbroken / rooted (anche se è comunque necessario per tenere conto del danno alla reputazione).

Assicurati di avere un sacco di controlli del sistema di integrità anche per vedere dove stanno andando i soldi. Se improvvisamente un utente sta inviando importi di denaro superiori alla media a conti nei paesi dell'Europa orientale, potrebbe essere una buona idea bloccare temporaneamente la transazione e chiamare attivamente il cliente per vedere se ha intenzione di inviare quel denaro.

    
risposta data 26.11.2014 - 13:41
fonte
3

Per i telefoni Android, c'è una memoria delle credenziali che ti permette di memorizzare le chiavi. Funziona come un demone di sistema e utilizza AES per crittografare le chiavi. Le chiavi sono legate all'UID dell'app che lo ha creato in modo che altre app non autorizzate possano accedere a queste chiavi.

Per iOS, esiste un portachiavi simile che ha uno scopo simile. È anche crittografato e in modalità sandbox, quindi le applicazioni possono recuperare solo i propri portachiavi.

Non memorizzare la chiave simmetrica in testo semplice. Sebbene l'archiviazione delle applicazioni in Android sia accessibile solo all'app stessa, è probabile che l'utente possa spostare l'app sulla scheda SD, che è quindi un gioco leale per tutte le app con le autorizzazioni per accedere alla scheda SD.

Non penso che sia necessaria una chiave principale poiché l'archiviazione delle credenziali e il portachiavi forniscono già la crittografia.

Tuttavia, potrebbe essere opportuno utilizzare la chiave simmetrica come segreto condiviso per negoziare una nuova chiave di sessione per ogni sessione, probabilmente attraverso Diffie-Hellman. Ciò ti consente di avere un perfetto segreto in avanti.

Infine, avresti a che fare con abili avversari che tentano di compromettere l'app perché c'è un incentivo finanziario. Ti suggerirei di cercare un consiglio professionale. Non per screditare la comunità qui, ma i rischi sono piuttosto alti.

    
risposta data 26.11.2014 - 13:35
fonte
1

Ti suggerisco di distribuire la chiave in più di un posto. Ad esempio

Chiave simmetrica:

  • divide le chiavi in due parti
  • salva la prima parte sul dispositivo e la seconda parte sul server
  • quando l'utente riesce ad accedere con OTP / SMS, quindi fornisce la seconda parte della chiave e crittografa / decrittografa le informazioni sensibili che desideri.

Chiavi asimmetriche

  • Puoi utilizzare anche chiavi asimmetriche, in cui sono coinvolte due chiavi (coppia di chiavi pubblica-privata)
  • Uno per la crittografia e altri per la decrittografia
  • Invia chiave pubblica e seconda chiave privata al server
  • Quindi il processo è uguale alla chiave simmetrica.
risposta data 18.11.2016 - 09:08
fonte

Leggi altre domande sui tag