¿Cómo Putty deriva la clave de cifrado en su formato .ppk?

5

He estado leyendo acerca de los mecanismos de administración de pares de claves RSA, durante los cuales Aprendí que OpenSSL por defecto deriva la clave de cifrado al usar MD5 en la frase de contraseña (¡mal!) sin ninguna extensión de clave (¡peor!):

  

¿Pero cómo se pasa de la frase de contraseña a la clave de cifrado AES? yo   no podía encontrarlo documentado en ninguna parte, así que tuve que cavar a través de la   Fuente de OpenSSL para encontrarlo:

     
  1. Agregue los primeros 8 bytes del IV a la frase de contraseña, sin un   separador (sirve de sal).
  2.   
  3. Toma el hash MD5 del resultado   cadena (una vez).
  4.   

Eso es todo.

El autor de la publicación del blog citado continúa explicando cómo OpenSSL admite el formato PKCS # 8 (sobre el cual no sé exactamente nada), ofreciendo protección contra las claves privadas cifradas de fuerza bruta que han caído en las manos equivocadas a través del estiramiento de teclas. (PBKDF2).

Sin embargo, mis propias claves privadas valiosas se almacenan en el formato .PPK de Putty, lo que plantea la pregunta: ¿qué tan bien están protegidas contra este tipo de ataque de fuerza bruta sin conexión?

    
pregunta Jon 22.10.2014 - 14:31
fuente

1 respuesta

2

Tengo que amar el código abierto! El siguiente código proviene de la versión estable Putty-0.63 release .

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); }

Su contraseña se procesa dos veces con SHA1 con ""else%code%%code%"%code%%code%%code%" y %code% como sales separadas. Los hashes resultantes se concatenan para formar la clave AES de 256 bits. No estoy completamente al tanto de todos los ataques de contraseña actuales, y aunque no creo que este sea el mejor esquema de hashing de contraseñas, no es el peor. Sí, SHA1 fue recientemente considerado no seguro , pero no creo que este esquema sea trivial de romper.

Algo para recordar acerca de la adivinación de contraseñas es que el atacante tiene que saber cuándo hay un éxito. En este caso, los bytes de la clave privada se cifran con una clave generada a partir de una contraseña. Por lo tanto, para cada intento de contraseña, el atacante debe realizar un descifrado AES de 256 bits además del hash. Hay una verificación de integridad para todo el archivo de claves. Para el archivo de claves PuTTY tenemos el siguiente HMAC:

%pre%

Ahora, después de realizar 2 hashes y 1 AES descifrar, el atacante ahora tiene que realizar otro hash SHA1 y un HMAC SHA1 con clave. Sólo para verificar si una suposición era correcta. Si no era un archivo de claves PuTTY, se produce el siguiente %code% :

%pre%

Obviamente no es tan seguro como usar un archivo de claves PuTTY, pero aún así totalizaría 3 hashings, 1 AES descifrar ... y una perdiz en un peral.

    
respondido por el RoraΖ 23.10.2014 - 14:07
fuente

Lea otras preguntas en las etiquetas