Gestione sessione per passphrase chiave privata in un'applicazione Web

4

Usa caso

Vorrei crittografare i dati in un database per un'applicazione Web. Esistono i seguenti requisiti:

  • La decrittografia dovrebbe essere possibile solo quando un utente fornisce una passphrase
  • La crittografia dovrebbe essere sempre possibile

Pertanto utilizzo la crittografia asimmetrica usando chiavi pubbliche e private. Un'operazione di crittografia può essere eseguita dall'app Web in qualsiasi momento, ma l'app Web può decrittografare solo quando l'utente fornisce una passphrase.

problema

Tutto questo funziona bene, ma il problema che ho è che ogni volta che l'utente vuole decodificare i dati, deve fornire una passphrase. Vorrei fornire all'utente l'opzione di "rimanere autenticato" per una sessione, dopo aver inserito la passphrase una volta.

Ecco dove sto avendo problemi. Se decido di memorizzare un hash della passphrase nella Session, il server sarebbe tecnicamente in grado di decodificare i dati senza l'input dell'utente. Anche ricordare un hash della passphrase in un cookie non è un'opzione.

Quali opzioni comuni ho? È possibile che il mio approccio complessivo non sia corretto?

Soluzione possibile?

Dopo un po 'di riflessione, ho intenzione di implementare quanto segue:

  • L'utente invia passphrase al server
  • Il server crea una chiave casuale a 128 bit
  • Il server esegue l'hashing della passphrase e lo crittografa con la nuova chiave casuale utilizzando AES
  • L'hash crittografato viene quindi memorizzato nella sessione sul server
  • Gli utenti memorizzano nel suo cookie: ID sessione e chiave di crittografia
  • Solo quando entrambi vengono forniti con una richiesta, il server può decrittografare i dati
  • La sessione non sarà più valida dopo un determinato periodo

È un approccio sicuro?

I dati possono essere decifrati solo se:

  • I dati crittografati vengono recuperati
  • La chiave privata viene recuperata
  • I dati della sessione vengono recuperati
  • I cookie dell'utente vengono recuperati

Note:

  • I dati stessi non sono crittografati con la chiave pubblica, ma una chiave casuale viene generata e utilizzata per crittografare i dati utilizzando AES. Questa chiave viene quindi crittografata con la chiave pubblica, che consente una qualche forma di gestione degli utenti.

  • Tutto viene eseguito in HTTPS

  • La chiave privata è crittografata con un hash della passphrase, non con la passphrase stessa

Grazie in anticipo

    
posta nanotvi 27.10.2014 - 10:35
fonte

1 risposta

1

Quello che hai descritto è molto simile (quasi identico) alle basi dello standard OpenPGP . Sarebbe saggio leggere su OpenPGP prima di provare a implementare questo schema.

Per rispondere alla tua domanda posta qui:

Here is where I am having trouble. If I decide the store a hash of the passphrase in the Session, then the server would technically be able to decrypt the data without the user's Input. Remembering a passphrase hash in a Cookie is also not an option.

Questa è una tautologia. Finché non si mantiene un paradigma di ingresso / uscita di testo cifrato per il proprio server, sarà sempre in grado di decrittografare i dati memorizzati a un certo punto. Il meglio che puoi fare è richiedere l'input dell'utente per ogni operazione.

    
risposta data 27.10.2014 - 16:33
fonte