En general, la información de la sesión no suele estar cifrada en el lado del servidor. En general, se supone que, como parte del modelo de amenaza, si un atacante obtiene acceso al servidor, entonces ya tiene todo lo que necesita. Los datos de la sesión en sí no suelen ser más sensibles que el resto del contenido de la base de datos.
Hay algunas opciones:
- Almacénelos en el sistema de archivos en texto plano. Si su modelo de amenaza sugiere que SQLi es más probable que el acceso al sistema de archivos, este es un movimiento fácil.
- Cifre los ID de sesión y los datos utilizando las rutinas de cifrado incorporadas en la base de datos. Esto lo protege contra casos en los que se compromete una copia de seguridad de la base de datos, pero no lo protegerá contra el robo de disco o contra un atacante con acceso a SQL.
- Cifre sus ID de sesión y los datos de sesión en la base de datos, usando una clave establecida en un archivo de configuración en el servidor en algún lugar. El beneficio de esto es que el atacante necesitaría acceso tanto a la base de datos (por ejemplo, a través de una inyección SQL) como al sistema de archivos al mismo tiempo para descifrar los ID de sesión y los datos de sesión.
- Cifre los ID de sesión y los datos utilizando una clave elegida al azar que se almacena en caché dentro del proceso del demonio del servidor (por ejemplo, APC o memcached para PHP). Esto sería extremadamente difícil para un atacante obtener acceso sin la ejecución completa del código en el sistema, pero tiene el inconveniente de que todos los datos de la sesión se invalidarán si reinicia el proceso del servidor.
Recomiendo el uso de cifrado autenticado, con cifrado y autenticidad separados. El pseudocódigo para el cifrado es el siguiente:
iv = secure_random(16)
encrypted = iv || AES-CBC-128(session_id || session_data, enc_key, iv)
auth_encrypted = HMAC-SHA256(encrypted, auth_key) || encrypted
El pseudocódigo para el descifrado es el siguiente:
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)
Esto proporciona cifrado autenticado para evitar la manipulación de los datos de sesión en el lado del servidor.