Memorizza la password localmente. Dove? Come passarlo in sicurezza?

13

Sto sviluppando un'applicazione. L'utente deve inserire le proprie credenziali che verranno inviate al server. Se l'utente apre l'applicazione una seconda volta, non dovrebbe essere necessario inserirli nuovamente: le credenziali devono essere memorizzate sul computer dell'utente. Anche questi dati possono essere passati in giro. La mia app è multipiattaforma, quindi sto cercando una soluzione multipiattaforma. Quindi passo dopo passo l'algoritmo dovrebbe assomigliare a questo:

  1. L'utente inserisce login e una password e questi dati vengono inviati al server. Come posso passarlo in sicurezza? Dovrei usare un protocollo sicuro come https o ssl?
  2. Se le credenziali sono corrette, devo salvare questi dati sul computer locale. Dovrei usare un file di database locale, un binario o solo un file di testo? Dove conservare questo file? E scommetto che ho bisogno di crittografarlo. Inoltre ho bisogno di decifrarlo più tardi, ma per la decifrazione ho bisogno di alcuni dati aggiuntivi (qualche chiave, probabilmente), giusto? Dove conservare questi dati aggiuntivi?
  3. A un certo punto ho bisogno di passare queste informazioni ad un altro processo. Ho già la comunicazione TCP tra i processi stabiliti. È abbastanza per passare? Devo passarlo crittografato o decrittografato.

Per favore correggimi se i miei passi sono sbagliati. Questa è la prima volta che mi occupo di sicurezza, quindi mi manca la conoscenza.

    
posta nikitablack 21.01.2015 - 13:00
fonte

4 risposte

9

HTTPS o un protocollo personalizzato che utilizza TLS per la crittografia è il modo corretto per comunicare in modo sicuro con un server remoto, supponendo che lo implementa correttamente e esca se qualcosa non va bene con i certificati (ho visto app mobili che nonostante l'utilizzo di HTTPS , ho accettato subito il mio certificato autofirmato senza nemmeno chiedere all'utente, rendendo inutile l'intera "sicurezza".

Archiviare le credenziali in modo sicuro sulla macchina è molto più difficile perché se la tua app può decrittografarle, quindi il malware può funzionare con gli stessi privilegi della tua app - qualsiasi protezione sarebbe solo sicurezza per oscurità e non fermerà un attaccante dedicato , può proteggere solo dai comuni "ladri" che sono principalmente progettati per rubare i profili del browser (cronologia, cookie di sessione) o file personali (per possibile furto d'identità) e non rubano l'effettivo binario dell'app in modo che l'attaccante non sappia come le credenziali salvate sono state crittografate, o anche se ha il binario dell'app, potrebbe non interessarsene, perché il reverse engineering richiede tempo e richiede esperienza (notare che spesso gli sviluppatori di malware non sono quelli che li distribuiscono e raccolgono / rivendono i furti dati).

Puoi ricavare una chiave dall'hardware come pbkdf2(sha512(OSname+OSversion+CPUmodel+MACaddress)) e usarla come chiave per crittografare le credenziali, che possono essere recuperate sulla stessa macchina ma non avvantaggeranno un utente malintenzionato se ha solo rubato le credenziali crittografate e binario dell'app, a meno che non abbia ancora accesso alla macchina per tornare indietro e ottenere lo stesso valore

Non è necessario utilizzare la crittografia per le comunicazioni tra processi sulla stessa macchina, se un utente malintenzionato può intercettare quella comunicazione che ha già il controllo della macchina (allo stesso livello di privilegio che l'app utilizza, se non superiore) significa che puoi leggere quello che ho detto sopra a non essere in grado di difenderci da questo.

    
risposta data 21.01.2015 - 13:26
fonte
12

The user enters login and a password, and this data goes to the server. How can I securely pass it? Should I use a secure protocol like https or ssl?

Sì! È necessario passare i dati in modo sicuro, ad esempio utilizzando TLS.

If the credentials are correct I need to save this data to the local machine. Should I use a local database file, a binary, or just a text file? Where to store this file? And I bet I need to encrypt this. Also I need to decrypt it later, but for decryption I need some additional data (some key, probably), right? Where to store this additional data?

È possibile generare una chiave invece della password, quindi ad esempio, nell'autenticazione il server restituisce un KEY (bit casuali) che lo salvano in un database con l'ID dell'utente, e lo memorizzano in KEY localy, ma in il server sai a chi appartiene. Quindi, nel secondo login, invii quella chiave al server, che controlla se è valida (appartiene a quell'utente) e non è scaduta.

At some point I need to pass this information to another process. I already have tcp communication between processes established. Is this enough for passing? Should I pass it encrypted or decrypted.

Ancora una volta, si passa solo la chiave. Puoi crittografare, ma è davvero difficile evitare tutti i tipi di attacchi che il tuo sistema potrebbe subire.

    
risposta data 21.01.2015 - 13:20
fonte
-1

Questo è quello che avevo in mente poiché ho già creato un'applicazione come questa che funziona come un incantesimo.

Poiché stai già utilizzando il protocollo TCP, puoi crittografare tutti i dati che stai inviando e decrittografarli all'interno dell'applicazione.

  1. L'utente effettua l'accesso e i dati che ha inserito la prima volta vengono inviati crittografati al server.

  2. Il server legge i dati crittografati e verifica se l'accesso è corretto e restituisce una risposta al client.

  3. Il client legge i dati e controlla se c'è un accesso riuscito.

  4. Il token è memorizzato all'interno dell'applicazione in modo che l'utente non debba inserire nuovamente i dati.

  5. Ogni volta che l'utente avvia l'applicazione, l'applicazione controlla prima il token di accesso, quindi esegue l'accesso automatico mentre viene caricata la schermata di avvio dell'applicazione.

Cifra tutti i dati in entrata e in uscita se hai intenzione di creare un'applicazione di messaggistica, o se si tratta di un'applicazione web, quindi criptare semplicemente le parti importanti.

Utilizza un handshake a 3 vie se desideri utilizzare un TCP personalizzato o usa HTTPS se questo è ciò che desideri se il suo web è correlato.

C'è solo un problema che potrebbe rovinare tutto e cioè se la macchina degli utenti è infettata da un keylogger in grado di leggere tutti i dati inviati dalla tastiera (ad esempio, la prima volta che deve usare le sue credenziali di accesso)

Spero che questo ti abbia aiutato abbastanza a guidarti nella giusta direzione.

    
risposta data 21.01.2015 - 16:41
fonte
-1

Puoi salvare la tua password in un gestore di password.
È gratuito e utile. Alcune opzioni

    
risposta data 23.11.2016 - 02:48
fonte

Leggi altre domande sui tag