Come ottenere un 'milione di colpi di PKCS # 8 + PBKDF2' con OpenSSL?

11

Ho postato questa domanda È una chiave privata SSH protetta da passphrase suscettibile a un attacco di dizionario? qualche giorno fa.

Un estratto dalla risposta finale :

With PKCS#8 + PBKDF2 and one million rounds (OpenSSL would need some coaxing to produce that), you gain 20 bits (because 220 is approximately equal to one million).

...

The openssl command-line tool does not allow choosing the number of iterations -- but OpenSSL, the library, supports it (and so does OpenSSH, since OpenSSH uses OpenSSL). Producing the encrypted key file would require some programming (calling the library with the appropriate parameters).

Ora, qualcuno sa di qualsiasi utilità preesistente che può realizzare quanto sopra? Se no, qualcuno può scrivere un programma del genere e renderlo pubblicamente disponibile per il bene di tutti ... come sono sicuro che anche gli altri lo troverebbero utile?

(Sono completamente nuovo alla sicurezza, alla crittografia, ai formati chiave e agli argomenti correlati, e non ho alcuna familiarità con il codice sorgente di OpenSSL, quindi non potrò fare in modo che OpenSSL faccia cose che è non già facendo.)

    
posta Harry 01.08.2013 - 11:22
fonte

1 risposta

15

Il metodo più semplice è ancora quello di applicare patch a OpenSSL, vale a dire lo strumento da riga di comando (non la libreria). Walk-through (assumendo un host Linux):

Scarica il codice sorgente OpenSSL . Prendi l'ultimo, che la pagina mostra in rosso (in questo momento, versione 1.0.1g ).

Disimballalo in una directory:

cd /tmp
tar xvzf ~/Downloads/openssl-1.0.1g.tar.gz

Modifica il file sorgente /tmp/openssl-1.0.1g/apps/pkcs8.c : cerca nella stringa "iter" finché non trovi queste righe:

            else if (!strcmp (*args, "-noiter"))
                    iter = 1;
            else if (!strcmp (*args, "-nocrypt"))
                    nocrypt = 1;

Questa è la riga 158 nella versione 1.0.1g. Modifica queste righe in modo che assomiglino a questo:

            else if (!strcmp (*args, "-noiter"))
                    iter = 1;
            else if (!strcmp (*args, "-iter"))
                    {
                    if (!args[1]) goto bad;
                    iter = atoi(*(++args));
                    if (iter <= 0) goto bad;
                    }
            else if (!strcmp (*args, "-nocrypt"))
                    nocrypt = 1;

In altre parole, aggiungi solo le 6 linee che gestiscono un nuovo argomento da riga di comando chiamato "-iter". Salva il file.

Quindi compila il codice:

cd /tmp/openssl-1.0.1g
./config --prefix=$HOME/local
make
make test
make install

E voilà! hai una nuovissima openssl strumento da riga di comando e libreria nella sottodirectory local della tua home directory (puoi metterla ovunque desideri con --prefix opzione, ma la scrittura nella directory home non richiede l'accesso root e non interferirà con gli strumenti forniti dal sistema operativo). Il comando dello strumento da riga di comando pkcs8 ora ha un'opzione -iter che può essere utilizzata per selezionare il numero di iterazioni:

$HOME/local/bin/openssl genrsa -out rsaraw.pem 2048
$HOME/local/bin/openssl pkcs8 -topk8 -v2 aes128 -iter 1000000 -in rsaraw.pem -out rsapk8.pem

Il file risultante può essere utilizzato con un OpenSSL o OpenSSH completamente standard, poiché la libreria ha sempre supportato PBKDF2 con un milione di iterazioni. Qui stiamo semplicemente aggiustando lo strumento da riga di comando per poter impostare quel conteggio dell'iterazione. Uno sguardo all'oggetto risultante mostrerà che il conteggio delle iterazioni è stato effettivamente preso in considerazione:

openssl asn1parse -i -in rsapk8.pem

mostrerà qualcosa che inizia con:

  0:d=0  hl=4 l=1312 cons: SEQUENCE          
  4:d=1  hl=2 l=  74 cons:  SEQUENCE          
  6:d=2  hl=2 l=   9 prim:   OBJECT            :PBES2
 17:d=2  hl=2 l=  61 cons:   SEQUENCE          
 19:d=3  hl=2 l=  28 cons:    SEQUENCE          
 21:d=4  hl=2 l=   9 prim:     OBJECT            :PBKDF2
 32:d=4  hl=2 l=  15 cons:     SEQUENCE          
 34:d=5  hl=2 l=   8 prim:      OCTET STRING      [HEX DUMP]:A4E21F4F210DEB6F
 44:d=5  hl=2 l=   3 prim:      INTEGER           :0F4240
 49:d=3  hl=2 l=  29 cons:    SEQUENCE          
 51:d=4  hl=2 l=   9 prim:     OBJECT            :aes-128-cbc
 62:d=4  hl=2 l=  16 prim:     OCTET STRING      [HEX DUMP]:DAA184B3F6CC303B6A40A131E5C8C451
 80:d=1  hl=4 l=1232 prim:  OCTET STRING      [HEX DUMP]:2C15CF37D5ACC537AA92B
 (...)

Vedi " 0F4240 "? Questo è un milione, in esadecimale.

La patch è banale; Proverò a inviarlo ai manutentori di OpenSSL.

    
risposta data 01.08.2013 - 13:45
fonte

Leggi altre domande sui tag