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.