Accedi all'applicazione all'avvio

4

Versione breve: voglio la casella di controllo "Accedi all'avvio del programma" come in Skype , per esempio, ma non sai come proteggere le credenziali salvate in modo sicuro.

Sto scrivendo un'applicazione client che, prima di fare richieste effettive al server, dovrebbe essere autorizzata dal server. L'autorizzazione è la seguente: l'utente riempie la finestra di accesso standard, i dati vengono inviati al server tramite HTTPS e, se è corretto, il server invia le credenziali.

Tuttavia, l'inserimento della password ogni volta disturba e impedisce l'avvio dell'applicazione all'avvio del sistema. Voglio crittografare quelle credenziali e salvarle su disco. Non sono riuscito a trovare la chiave di crittografia appropriata, tuttavia.

La chiave dovrebbe essere, ovviamente, specifica dell'utente (non a livello di sistema!) e ragionevolmente difficile da frodare.

Per ora uso solo hash di alcune informazioni e nome utente dell'HDD e ripiego all'hash dell'ambiente di processo, se la chiamata WinAPI fallisce (quanto è grave?).

Sto scrivendo per Windows usando C ++ / Qt, ma ogni raccomandazione è benvenuta. Grazie.

UPD1

Ok, per essere chiaro:

  1. Livello di crittografia richiesto è:
    non puoi effettuare il login semplicemente copiando il file credentials.dat da un computer ad un altro (o una cartella utente ad un altro);
  2. Mantenere la password protetta (che non è archiviata dall'applicazione) è responsabilità dell'utente.
  3. Voglio memorizzare non la password, ma token di accesso crittografato che è user-id e public key per crittografare le comunicazioni con il server.

Dalle tue risposte ho capito che il mio auth. il sistema non è a posto. Lo riconsidererò. E sì, ho accesso a entrambi, lato server e lato client.

Per ora, voglio determinare la chiave di crittografia unica per macchina e utente, che posso ottenere dal sistema operativo in fase di runtime per decodificare / codificare le credenziali (che è la risposta del server a email / password inserite dall'utente).

    
posta Alexey Zabrodsky 14.03.2012 - 17:20
fonte

3 risposte

7

Potresti fare un metodo base di CHAP .

Esempio:

Client e server dispongono di una chiave privata condivisa per ciascun utente client.

  • L'utente autentica la prima volta; server restituisce un token di passaggio (guid)
  • pass token è archiviato come client.
  • In "Login all'avvio del programma", il client richiede l'accesso.
  • Il server risponde con un "token di accesso" e precarica la risposta (chiave privata condivisa + token di accesso + token di passaggio)
  • il client risponde dando l'HASH di (chiave privata condivisa + token di accesso + token di passaggio).

  • Il pass token è valido finché l'utente non si disconnette.

Modifica Ho fatto qualcosa di simile a questo per un servizio web, un po 'più coinvolto ma con gli stessi principi.

    
risposta data 14.03.2012 - 18:12
fonte
1

Se la tua applicazione deve fornire lo username e la password ogni volta, quindi in un modo o nell'altro, li memorizzerai localmente (offuscati in qualche modo o meno).

Se è possibile modificare l'autenticazione lato server, è possibile implementare un'autenticazione basata su token di accesso (come nella risposta di Darknight), che è ciò che preferirei a me stesso. In questo modo, evita di archiviare le password sul disco rigido dell'utente .

Se non hai il controllo sul lato server, e devi fornire ogni volta username e password, sono d'accordo con Tom Squires che dovresti memorizzarli nel modo più semplice possibile.

Perché? Perché fare qualsiasi altra cosa è fornire un falso senso di sicurezza all'utente . Per una discussione completa, dovresti leggere "Password di testo normale" nella wiki di Pidgin .

Dovresti leggere quella pagina per l'argomento completo, ma per riassumere brevemente :

  • Qualsiasi password oscurata (qualsiasi cosa che non sia nascosta dietro l'altra password) può eventualmente non essere oscurato.
  • Non solo non può essere oscurato, ma si potrebbe creare un'utilità che ti restituisca il password in testo semplice con un solo tasto: premere

Se hai un accesso fisico al computer, le password non sono rilevanti.

    
risposta data 14.03.2012 - 19:06
fonte
0

Puoi crittografarlo e memorizzare le informazioni di credenziali sul lato client utilizzando qualsiasi algoritmo strong e consigliato come SHA-1. Ma non conservare la chiave utilizzata per la crittografia sul lato client. Consenti solo al tuo server di conoscere la chiave che può decrittografare i dati.

Per mantenere sincronizzati client e server, è possibile chiedere all'utente di accedere / registrarsi nel proprio sito Web e quindi fornirgli il link per scaricare l'applicazione. Durante la creazione del collegamento dell'applicazione impiantare un seme nell'applicazione e memorizzarlo nello stesso modo con l'ID utente nel DB lato server. Utilizzare questo seme per crittografare e archiviare le credenziali sul lato client ed eliminare il seed dopo il primo accesso riuscito.

    
risposta data 15.03.2012 - 07:21
fonte

Leggi altre domande sui tag