¿Cuál es la opción "secreta" de la sesión?

111

No sé nada de criptografía. Me pregunto cuál es el secreto de la sesión.

Veo un código como este:

app.use(express.session({
  store: mongoStore({
    url: app.set('db-uri')
  }),
  secret: 'topsecret'
}));

¿Cuál es el secreto y debería cambiarlo?

Harry
fuente

Respuestas:

83

Sí, deberías cambiarlo. Un secreto de sesión en Connect se usa simplemente para calcular el hash . Sin la cadena, el acceso a la sesión esencialmente sería "denegado". Eche un vistazo a los documentos de conexión , que deberían ayudar un poco.

Hacknightly
fuente
43
No solo puede cambiarlo, sino que también debe cambiarlo.
Michael Mior
1
@MichaelMior, ¿con qué frecuencia?
FRD
9
@FRD Mi punto es que no debes mantener el valor predeterminado de algo como topsecret. El secreto debe ser una cadena de caracteres aleatoria. Idealmente, también lo cambiaría periódicamente en caso de que se haya descubierto. Sin embargo, esto requiere soporte para la rotación secreta para que no invalide inmediatamente las sesiones existentes. Es decir, dos secretos de sesión deben considerarse válidos simultáneamente. Que yo sepa, Express no es compatible con la rotación de secretos en este momento.
Michael Mior
7
@MichaelMior express-session desde 1.11.0 admite la rotación secreta. De los documentos: "Si se proporciona una serie de secretos, solo se utilizará el primer elemento para firmar la cookie de identificación de sesión, mientras que todos los elementos se considerarán al verificar la firma en las solicitudes". (Ver expressjs / session # 127 para más detalles).
Wolfgang
¿Es lo mismo que la cookie firmada? En caso afirmativo, ¿necesita hacer esto?res.cookie('name', 'value', {signed: true})
Muhammad Umer
22

El secreto se usa para hash la sesión con HMAC:

https://github.com/senchalabs/connect/blob/master/lib/middleware/session.js#L256

Luego, la sesión se protege contra el secuestro de la sesión al comparar la huella digital con el hash con el secreto:

https://github.com/senchalabs/connect/blob/master/lib/middleware/session.js#L281-L287

sub-pila
fuente
3
Sin embargo, ¿cómo protege el hash contra el secuestro de sesiones? Si el atacante tiene la cookie de sesión, ¿no tiene también el hash? Si el atacante no tiene la cookie, ¿cómo es que el hash secreto hace que sea más difícil de adivinar (en comparación con tener una ID de sesión aleatoria más larga)?
Stuart P. Bentley
8
el secreto es una sal para el hash, esto solo hace que sea más difícil para alguien: 1. descifrar una cookie phishing, 2. falsificar una sesión haciéndose pasar por un usuario, ya que no tienen el secreto (sal) que no pueden producir una identificación de sesión adecuada.
mattdlockyer
7
Ambos enlaces no son válidos debido a que se trata de una respuesta de hace 3 años.
Trysis
5
@mattdlockyer Esto no lo protege contra el secuestro de sesiones. ¿Y por qué un atacante intentaría descifrar una cookie? Si el atacante tiene la cookie, entonces ya tiene acceso completo hasta que finalice la sesión. Quiero decir que no es como si la gente almacenara la contraseña de su usuario en la cookie, eso sería ridículo. Y cosas como jwt casi siempre deben evitarse.
Forivin
Parece haber respuestas mixtas con respecto al propósito del secreto de una sesión. Algunos dicen que protege contra el secuestro de sesiones, mientras que otros no están de acuerdo. ¿Alguien puede explicar cuál es el verdadero propósito de generar este hash? Precisamente, ¿para qué está calculando un hash?
nawK
-9

clave secreta que se utiliza básicamente para cifrar datos en la sesión

Rahul Saini
fuente
8
No, no lo es. Vea la respuesta aceptada de hace 6 años.
Quentin