Esiste un modo per autenticare un client HTTP solo una volta?

2

Sto lavorando a un'applicazione che funge da back end (API REST) per un'estensione di Google Chrome. I dati dovrebbero essere inviati da e verso il cliente.

Il modo in cui funziona è:

  • I dati provenienti dal client vengono crittografati dall'applicazione utilizzando AES-256 (utilizzando la chiave master, guarda sotto ) e archiviati in un database SQLite3.
  • I dati inviati dall'applicazione al client vengono decrittografati nel back-end e quindi inviati tramite un protocollo HTTP.

Nota, l'applicazione e l'estensione risiedono nello stesso ambiente locale, quindi altri computer sulla rete non possono accedervi. Ecco perché i dati vengono trasferiti in testo normale in entrambi i casi.

Ci sono alcuni vincoli:

  • Può esserci un numero di client che inviano richieste al back-end. Sono tutti controllati dalla stessa persona.
  • C'è un segno di accesso nel client e richiede solo una chiave master. Una volta inviato il modulo, la chiave deve essere inviata al back-end e il client viene autenticato, cioè confrontandolo con quello (crittografato usando PBKDF2) nel database.

Il problema Il problema è che non voglio memorizzare la chiave master in modo persistente nel client (Javascript), in quanto può essere facilmente individuata da chiunque altro possa accedere al computer. Se era possibile autenticarsi solo una volta, inviando la chiave master tramite il protocollo all'applicazione e quindi rimuovere la chiave dal client.

Quindi la domanda è quale sarebbe la soluzione ottimale?

    
posta Andrius 19.01.2018 - 17:14
fonte

2 risposte

1

Is there any way to authenticate a HTTP client only once?

No, perché HTTP è senza stato.

data that comes from the client is encrypted...using the master key

Sia il contenuto nel browser, sia le cose sul server è l'applicazione. Dove si verifica la crittografia?

The data that is sent by the application to the client is decrypted in the back end and then sent over an HTTP protocol

OK, quindi quando dici domanda intendi davvero il lato server?

Sembra che non ci sia mai alcun obbligo di memorizzare la "chiave master" sul client.

sign in form in the client and it only requires a master key

Utilizzi anche la chiave di crittografia come token di autenticazione? Veramente? Ti aspetti che gli utenti inseriscano qualcosa come

c48bb691eb5e2f609192ed5a981c6f8745896aa968604c1cdf70cb57ebc0d421

ogni volta che effettuano l'accesso? Scommetto che stai permettendo loro di scegliere password / chiavi davvero semplici o che le stanno memorizzando da qualche parte.

È possibile semplicemente archiviare la chiave master sul lato server in una variabile di sessione HTTP. Ma se questa è davvero una chiave "master", i client / utenti non dovrebbero avere visibilità. È necessario separare l'autenticazione dalla crittografia.

Ci sono varie cose che puoi fare con l'archiviazione locale, un secondo server, crittografare la chiave master con la password dell'utente per proteggerla, ma senza sapere molto di più sulla piattaforma è impossibile da consigliare (e diventa troppo complessa per una discussione qui).

    
risposta data 18.02.2018 - 22:16
fonte
0

i.e. by comparing it to the one in the database.

...

The problem is that I don't want to store the master key persistently in the client (Javascript), as it can easily be looked up by anyone else who can access the computer.

Dato che hai stabilito che:

  1. La chiave principale è memorizzata nel database.
  2. Il database si trova sullo stesso computer del client.
  3. Sei preoccupato per gli aggressori locali con accesso al computer.

Hai già perso. La chiave master può essere rubata dal database. Non sono sicuro del motivo per cui sei convinto che archiviarlo, ad es., LocalStorage sia meno sicuro del database.

Difendersi da un utente malintenzionato con accesso fisico che può eseguire codice sulla tua macchina (che è quello che "chiunque altro possa accedere al computer" suona come me) è praticamente impossibile. Il meglio che si può ottenere è un account utente locale separato con una sorta di crittografia per utente per proteggere i dati, utilizzando chiavi supportate dal TPM e un ambiente di avvio protetto, ma all'improvviso si è passati dalla creazione di un'estensione di Chrome alla necessità di proteggere l'intero ambiente.

    
risposta data 19.01.2018 - 17:23
fonte

Leggi altre domande sui tag