Che cosa significa veramente l'opzione -a di ssh-keygen?

2

Ho scoperto che il nuovo formato OpenSSH per l'archiviazione delle chiavi private SSH ( ssh-keygen -o ) utilizza bcrypt per generare la chiave simmetrica per crittografare la chiave privata. Comprendo che l'opzione -a viene utilizzata per regolare il fattore di lavoro bcrypt. Tuttavia, non capisco la relazione esatta tra il fattore lavoro e il valore dato. -a 200 impiega circa 5 secondi sulla mia CPU, mentre questo benchmark va al massimo con un fattore di lavoro di 20 prendendo più di un minuto. Il fattore di lavoro è una scala logaritmica, e dubito che il mio laptop sia veramente > 2 ^ 10 volte più veloce del laptop di questa persona.

Chiaramente -a non si traduce direttamente nel fattore di lavoro bcrypt. Quindi che è la relazione?

Il motivo per cui voglio sapere è estrapolare un tasso di cracking "worst-case" per il mio valore -a scelto basato su questo benchmark di un cracking rig di fascia alta (per il 2017) (che ipotizza ~ 100k hash / sec su 8 GPU, utilizzando un fattore di lavoro bcrypt di 5 per i test).

    
posta dn3s 19.06.2017 - 09:40
fonte

1 risposta

3

Questo differisce tra ssh-keygen versioni. Da questo post :

The original difficulty parameter for bcrypt is the log2 number of times to rekey the cipher. bhash fixes this number at 64, and instead relies on the PBKDF2 rounds parameter to control difficulty.

La mia risposta originale era basata sulla pagina man per ssh-keygen che afferma quanto segue:

-a rounds When saving a new-format private key (i.e. an ed25519 key or any SSH protocol 2 key when the -o flag is set), this option specifies the number of KDF (key derivation function) rounds used. Higher numbers result in slower passphrase verification and increased resistance to brute-force password cracking (should the keys be stolen).

Quindi un valore di 200 itererà le KDF 200 volte. Questo è un equivalente di un fattore di lavoro di 7,64 , non 200 come ti aspetti.

Se volevi il tuo worker di 200 devi specificare -a 1606938044258990275541962092341162602522202993782792835301376 .

Questo non funzionerà per due motivi:

  • Invalid number (too large) viene restituito.
  • Non hai pochi universi di tempo da dedicare.

Se volevi provare 20 come nell'esempio, utilizza questo numero , 1048576.

Fondamentalmente hai bisogno delle seguenti due formule:

Work factor = log2(rounds)

Rounds = 2work factor

Aggiornamento

Pertanto, se si utilizza la versione bhash, dividere il numero dal mio funzionamento sopra per 64.

$ time ssh-keygen -o -a 16384 -f ./testkey -N password123
Generating public/private rsa key pair.
Your identification has been saved in ./testkey.
Your public key has been saved in ./testkey.pub.
The key fingerprint is:
SHA256:eU/T6ex/wDJNsb8soOzGN/uxup0Zdjthvxt1e23wb6c foo@bar
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|              .  |
|               o |
|         .   .o. |
|        S . o++.o|
|         . +o++=*|
|        o . o*==O|
|         = oooB=X|
|        o..+**EBO|
+----[SHA256]-----+

real    2m17.181s
user    2m16.677s
sys 0m0.005s
    
risposta data 19.06.2017 - 21:40
fonte

Leggi altre domande sui tag