Play Framework per Scala supporta i cookie di sessione firmati. Nel file di configurazione dell'applicazione è presente un "segreto dell'applicazione" che viene impostato come numero casuale sicuro quando il codice sorgente dell'applicazione viene inizializzato. Questo segreto viene condiviso tra più copie dell'applicazione in esecuzione in una server farm Web in modo che tutte le firme dei cookie possano essere verificate su qualsiasi server.
Quando viene creata una sessione in Play, la sessione viene firmata automaticamente utilizzando l'applicazione secret e HMAC-SHA1.
Sono preoccupato che venga utilizzato lo stesso segreto dell'applicazione per la vita dell'applicazione. Questa preoccupazione è valida?
Stavo cercando un modo migliore per firmare i cookie, ma conosco il motto contro l'inventare le tue tecniche crittografiche.
Esiste un modo accettato per condividere tutti i server con un segreto che cambia?
Ho pensato a quanto segue (nota che tutti i cookie di sessione sono solo in memoria e scadono quando il browser è chiuso):
- Incorpora la data della firma (UTC) in ciascun cookie.
- La chiave di firma viene generata in modo casuale dalla prima firma del giorno (dopo la mezzanotte) e archiviata nel database per tutti i server da condividere.
- Quando un server deve firmare un cookie, controlla la propria chiave di firma e la data in cui è stato generato e confronta quella data con la data corrente.
- Se la data della firma è la stessa della data corrente, la chiave viene utilizzata per firmare il cookie.
- Se la data della firma è precedente alla data corrente, il server controlla il database per una nuova chiave di firma con la data corrente.
- Se esiste una chiave con la data corrente nel database, viene utilizzata per firmare il nuovo cookie. Le vecchie chiavi di firma vengono conservate (per un certo numero di giorni) per verificare i cookie meno recenti.
- Se non è presente alcuna chiave per la data corrente, ne viene generata una nuova (come faccio a gestire più server facendo ciò contemporaneamente in un database NoSQL?).
Come algoritmo alternativo, posso generare un nuovo segreto ogni giorno usando HMAC (segreto dell'applicazione, data corrente). Con questo, non ho bisogno di memorizzare le chiavi segrete giornaliere nel database, dal momento che tutti i server possono generare la stessa sequenza giornaliera di chiavi. Non sono sicuro se questo è più (o meno) sicuro di memorizzare la chiave giornaliera nel database. Ho bisogno di proteggere l'applicazione segreta, ma non più di quanto ho bisogno di proteggere il database. Si consiglia di non archiviare il segreto dell'applicazione nel controllo del codice sorgente, ma di caricarlo da una variabile di ambiente impostata su ciascun server di produzione.