In che modo Putty ottiene la chiave di crittografia nel suo formato .ppk?

5

Ho fatto alcune letture sui meccanismi di gestione delle coppie di chiavi RSA, durante le quali Ho appreso che OpenSSL di default deriva la chiave di crittografia usando MD5 sulla passphrase (bad!) senza alcun allungamento della chiave (peggio!):

But how do you get from the passphrase to the AES encryption key? I couldn’t find it documented anywhere, so I had to dig through the OpenSSL source to find it:

  1. Append the first 8 bytes of the IV to the passphrase, without a separator (serves as a salt).
  2. Take the MD5 hash of the resulting string (once).

That's it.

L'autore del post sul blog citato continua a spiegare come OpenSSL supporta il formato PKCS # 8 (di cui non conosco proprio nulla), offrendo protezione contro le chiavi private crittografate che sono cadute nelle mani sbagliate attraverso lo stretching chiave (PBKDF2).

Tuttavia, le mie preziose chiavi private sono memorizzate nel formato .PPK di Putty che solleva la domanda: quanto sono protetti da questo tipo di attacco brute-force offline?

    
posta Jon 22.10.2014 - 14:31
fonte

1 risposta

2

Devi amare l'open source! Il seguente codice è tratto dalla versione stabile Putty-0.63 .

sshpubk.c

/*
 * Decrypt the private blob.
 */
if (cipher) {
unsigned char key[40];
SHA_State s;

if (!passphrase)
    goto error;
if (private_blob_len % cipherblk)
    goto error;

SHA_Init(&s);
SHA_Bytes(&s, "
    SHA_State s;
    unsigned char mackey[20];
    char header[] = "putty-private-key-file-mac-key";

    SHA_Init(&s);
    SHA_Bytes(&s, header, sizeof(header)-1);
    if (cipher && passphrase)
    SHA_Bytes(&s, passphrase, passlen);
    SHA_Final(&s, mackey);

    hmac_sha1_simple(mackey, 20, macdata, maclen, binary);

    smemclr(mackey, sizeof(mackey));
    smemclr(&s, sizeof(s));
else {
        SHA_Simple(macdata, maclen, binary);
    }
/*
 * Decrypt the private blob.
 */
if (cipher) {
unsigned char key[40];
SHA_State s;

if (!passphrase)
    goto error;
if (private_blob_len % cipherblk)
    goto error;

SHA_Init(&s);
SHA_Bytes(&s, "
    SHA_State s;
    unsigned char mackey[20];
    char header[] = "putty-private-key-file-mac-key";

    SHA_Init(&s);
    SHA_Bytes(&s, header, sizeof(header)-1);
    if (cipher && passphrase)
    SHA_Bytes(&s, passphrase, passlen);
    SHA_Final(&s, mackey);

    hmac_sha1_simple(mackey, 20, macdata, maclen, binary);

    smemclr(mackey, sizeof(mackey));
    smemclr(&s, sizeof(s));
else {
        SHA_Simple(macdata, maclen, binary);
    }
%pre%%pre%", 4); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, key + 0); SHA_Init(&s); SHA_Bytes(&s, "%pre%%pre%%pre%", 4); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, key + 20); aes256_decrypt_pubkey(key, private_blob, private_blob_len); }
%pre%", 4); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, key + 0); SHA_Init(&s); SHA_Bytes(&s, "%pre%%pre%%pre%", 4); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, key + 20); aes256_decrypt_pubkey(key, private_blob, private_blob_len); }

La tua password viene cancellata due volte usando SHA1 con ""else%code%%code%"%code%%code%%code%" e %code% come sali separati. Gli hash risultanti sono concatenati per formare la chiave AES a 256 bit. Non sono completamente aggiornato su tutti gli attuali attacchi con password e, anche se non credo che questo sia il miglior schema di hashing delle password, non è il peggiore. Sì, SHA1 è stato recentemente ritenuto non sicuro , ma non credo che questo schema sarebbe banale da rompere.

Qualcosa da ricordare su come indovinare la password è che l'attaccante deve sapere quando c'è un successo. In questo caso i byte della chiave privata sono crittografati con una chiave generata da una password. Pertanto, per ogni tentativo di password, l'autore dell'attacco deve eseguire una decrittografia AES a 256 bit oltre all'hashing. Esiste un controllo di integrità per l'intero file di chiavi. Per il file-chiave PuTTY abbiamo il seguente HMAC:

%pre%

Ora, dopo aver già eseguito 2 hash e 1 decrypt AES, l'attacker ora deve eseguire un altro hash SHA1 e un HMAC SHA1 con chiave. Giusto per verificare se una supposizione fosse corretta. Se non si trattava di un file di chiavi PuTTY, si verificava il seguente %code% :

%pre%

Ovviamente non è sicuro come usare un file di chiavi PuTTY, ma ciò equivarrebbe comunque a 3 hash, 1 decrypt AES ... e una pernice in un albero di pere.

    
risposta data 23.10.2014 - 14:07
fonte

Leggi altre domande sui tag