SSH session_id en RFC 4253 (intercambio de claves)

1

en RFC 4253 "Protocolo de la capa de transporte SSH", sección 7.2 especifica cómo las claves de integridad y cifrado de la sesión (y IVs) se derivan del secreto compartido (K) y el valor hash de intercambio (H). Utiliza, una parte de estos valores y constantes, un session_id. Por ejemplo,

Initial IV server to client: HASH(K || H || "B" || session_id)

Estoy confundido ya que pensé que H era en realidad el identificador de sesión. ¿Qué es session_id y cómo se obtiene?

    
pregunta gna 19.04.2016 - 15:18
fuente

1 respuesta

1

Está en el código fuente de openssh como se describe en la RFC y simplemente podemos rastrear su fuente desde allí:

/* K1 = HASH(K || H || "A" || session_id) */
if ((hashctx = ssh_digest_start(kex->hash_alg)) == NULL ||
    ssh_digest_update_buffer(hashctx, shared_secret) != 0 ||
    ssh_digest_update(hashctx, hash, hashlen) != 0 ||
    ssh_digest_update(hashctx, &c, 1) != 0 ||
    ssh_digest_update(hashctx, kex->session_id,
    kex->session_id_len) != 0 ||
    ssh_digest_final(hashctx, digest, mdsz) != 0) {
    [...]

Desde el RFC:

  

El hash de intercambio H del primer intercambio de claves se usa adicionalmente como identificador de sesión, que es un identificador único para esta conexión.

Esto significa que el session_id es igual a hash ( H ) para el primer intercambio de claves. Si hay otro intercambio de claves más adelante, siempre será el hash del primer intercambio de claves.

Verificación también del código de DH :

/* calc and verify H */
hashlen = sizeof(hash);
if ((r = kex_dh_hash(
[...]

if (kex->session_id == NULL) {
    [...]
    memcpy(kex->session_id, hash, kex->session_id_len);
}

if ((r = kex_derive_keys_bn(ssh, hash, hashlen, shared_secret)) == 0)
    [...]

confirma esta idea. Primero calculamos H , luego actualizamos session_id (si no está configurado) y luego obtenemos las claves (código de arriba).

    
respondido por el Jakuje 19.04.2016 - 21:00
fuente

Lea otras preguntas en las etiquetas