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.