In generale, le informazioni sulla sessione non sono solitamente crittografate sul lato server. In genere, come parte del modello di minaccia, si presume che se un utente malintenzionato ottiene l'accesso al server, ha già tutto ciò di cui ha bisogno. Di solito i dati di sessione non sono più sensibili rispetto al resto del contenuto del database.
Ci sono alcune opzioni:
- memorizzali sul filesystem in testo semplice. Se il tuo modello di minaccia suggerisce che SQLi è più probabile dell'accesso al filesystem, questa è una mossa facile.
- Codifica ID sessione e dati utilizzando le routine di crittografia incorporate del database. Questo ti protegge dai casi in cui un backup del database è compromesso, ma non ti protegge dal furto del disco o da un utente malintenzionato con accesso SQL.
- Cifra i tuoi ID di sessione e i dati di sessione nel database, utilizzando un set di chiavi in un file di configurazione sul server da qualche parte. Il vantaggio di questo è che l'utente malintenzionato dovrebbe avere accesso sia al database (ad esempio tramite SQL injection) che al filesystem allo stesso tempo per decodificare gli ID di sessione e i dati di sessione.
- Codifica gli ID di sessione e i dati utilizzando una chiave scelta a caso che viene memorizzata nella cache all'interno del processo del daemon del server (ad esempio APC o memcached per PHP). Ciò sarebbe estremamente difficile per un utente malintenzionato di accedere a senza l'esecuzione completa del codice nel sistema, ma ha il lato negativo che tutti i dati della sessione sarebbero invalidati se si riavvia il processo del server.
Raccomando l'uso della crittografia autenticata, con crittografia e autenticità separate. Lo pseudocodice per la crittografia è il seguente:
iv = secure_random(16)
encrypted = iv || AES-CBC-128(session_id || session_data, enc_key, iv)
auth_encrypted = HMAC-SHA256(encrypted, auth_key) || encrypted
Lo pseudocodice per la decrittazione è il seguente:
mac = auth_encrypted[0:31]
encrypted = auth_encrypted[32:]
expected_mac = HMAS-SHA256(encrypted, auth_key)
if mac != encrypted_mac:
session was tampered with
else:
iv = encrypted[0:15]
encrypted = encrypted[16:]
decrypted = AES-CBC-128_Decrypt(encrypted, enc_key, iv)
Fornisce la crittografia autenticata per impedire la manomissione dei dati di sessione sul lato server.