SSH session_id in RFC 4253 (scambio di chiavi)

1

in RFC 4253 "SSH Transport Layer Protocol", sezione 7.2 specifica come le chiavi di crittografia e integrità della sessione (e IV) derivano dal segreto condiviso (K) e dal valore hash dello scambio (H). Usa, parte da questi valori e costanti, un session_id. Per es.

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

Sono confuso da quando ho pensato che H fosse in realtà l'identificatore di sessione. Cos'è session_id e come viene ottenuto?

    
posta gna 19.04.2016 - 15:18
fonte

1 risposta

1

È nel codice sorgente di openssh come descritto nella RFC e possiamo semplicemente rintracciare la sua fonte da lì:

/* 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) {
    [...]

Da RFC:

The exchange hash H from the first key exchange is additionally used as the session identifier, which is a unique identifier for this connection.

Ciò significa che session_id è uguale a hash ( H ) per il primo scambio di chiavi. Se c'è un altro scambio di chiavi in seguito, è sempre l'hash dal primo scambio di chiavi.

Verifica anche codice di 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)
    [...]

conferma questa idea. Per prima cosa calcoliamo H , quindi aggiorniamo session_id (se non è già impostato) e quindi ricaviamo le chiavi (codice sopra).

    
risposta data 19.04.2016 - 21:00
fonte

Leggi altre domande sui tag