Utilizzo di PGP per rispondere alle domande di sicurezza dell'account con PKI

1

Le domande di sicurezza sono ben note / ampiamente considerate per ridurre la sicurezza o creare in altro modo più problemi (ad esempio, ricordare parole senza senso), ma a volte sono obbligato ad avere e rispondere comunque. Nonostante ciò sia stato discusso molte volte prima, quindi non terrò qui il dibattito, sono un fan delle password che sono al tempo stesso sicure e possono essere facilmente (ri) generate, quindi quello che mi piacerebbe fare è rispondere alle domande di sicurezza con una parte della mia firma pgp per le domande stesse. Tuttavia, questo mi lascia con due problemi di cui non sono sicuro:

  1. se c'è qualcosa che mi manca potrebbe rendere questa versione meno sicura o meno riproducibile (diverse versioni di gpg o algoritmi predefiniti, ecc.) di quanto io possa pensare che sia, e
  2. dove estrarre la parte della firma, considerando qualcosa come l'intestazione pgp e il fatto che la firma completa è troppo lunga per essere utilizzata realisticamente.

Attualmente, se utilizzo echo -n 'What is the air speed velocity of an unladen swallow?' | gpg -s --clearsign , ottengo:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

What is the air speed velocity of an unladen swallow?
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJaUnsoAAoJEAsnyIE5nAz6NLQP/2Yb33we/32eyWhHoCcYpzQI
0Si5AD+BJCrpcKgAehKdkx/eaHPKfTX55cxT23qk14XiLwnDqSsK/oPazuUwUIoP
brWkgqXj2G2YhQkBKe/WaEafbi3J7kmeddrmpaFrAkKkYYdFcC8zXtH9YcpM5OB2
kMava8oO0K6exoY4r2Fa9mIiOHrFZXkbtY9NuOvxhhOLmAeQolJ7WBdc+mt/Pmwv
0YIWlJhLgxxqqtXTlHXNNbatqkClAE1DB48FyyP3Mi8P8Ny+3z6ntDtwZezF+Lc4
67hWsUzjZ24E4Ww0CLquFTomNscuTFJRnAKJE02ctDixuz17zZxaliQBXdTrA43k
OUr+d9P2OdJXNPA0H9GQV9T+6CrHXM3dRXzrpSTrXzg7ZM8EWDB2b9iPp5b60KmE
/IwG0ijWH3B90gXJeGW2KeUm8qhH6AYBeXG+Yv2+9tB6T7KYETMku+FKgh61O6MJ
hYnQ7YMRhf8WjZw6m+jZ3knn0tIYqwszlJ7nJ0qlYlMsY9YzJkvKTpGQLHxQqDJv
ZraIbgPJuPJ1uT+qbbWk+QgOpehAyAFC/3aI57eqI/3poKl2/2f3QMsw7yRPnN/s
HeIvXhEVBqcOb7pfI3i6pT9f01QG5u16/vAKf6pq9WOuVTCeH5CP0t0xZ3eF+kJ+
m4C4rL/Q+uSexZL9IQ07
=jh/a
-----END PGP SIGNATURE-----

Quello che mi piacerebbe fare è prendere un frammento di firma di 16 caratteri lungo da usare come risposta che sarebbe in una posizione coerente e facilmente reperibile in modo da poter riprodurre in modo affidabile le mie risposte a tutte le domande di sicurezza future, ma dove dovrebbe essere? Almeno i primi 18 personaggi sembrano essere gli stessi indipendentemente dall'input, ma questo da solo non è sufficiente per convincermi a scartare i primi 18 e usare i successivi 16.

Qualcuno può rispondere ai due dubbi sopra riportati?

Aggiorna

Questa domanda era originariamente incentrata sul fatto che PGP fosse percepito come la potenziale soluzione al mio problema, che si dimostrò non adatto al requisito di riproducibilità. Tuttavia, mi piace ancora l'idea di trattare domande di sicurezza simili all'autenticazione sfida-risposta con i vantaggi di sicurezza acquisiti in genere attraverso approcci PKI (ad esempio, verificabilità, non ripudio, ecc.). In assenza di tale soluzione, HMAC può essere un'alternativa praticabile, ma si riduce ad essere più semplicemente un'altra password (qualcosa che conosco) invece di una risposta verificabile in base a qualcosa legato alla mia identità come una chiave (qualcosa che ho ). Anche se questa non è una domanda del MAE, vorrei sapere se ci sono altri possibili approcci che potrebbero avvicinarmi a ciò che avevo immaginato?

    
posta Hiko Haieto 07.01.2018 - 21:15
fonte

2 risposte

1

Il formato di una firma PGP è un messaggio codificato in base 64 che contiene un numero di campi, molti dei quali sono fissi o prevedibili. (ad es. identificatori di chiavi, algoritmi in uso, campi di lunghezza, ecc.) Inoltre, le firme contengono timestamp, quindi se si rigenera una firma, non si ha la certezza di ottenere gli stessi valori. Le firme PGP non sono deterministiche, quindi non si adattano bene al tuo caso d'uso.

Se vuoi fare qualcosa di simile, utilizzerei un HMAC con un solo segreto per generare la risposta. Tuttavia, se lo fai, due siti con la stessa domanda di sicurezza ottengono la stessa risposta. (Non peggiore della tua proposta originale, né della tradizionale implementazione della domanda di sicurezza, solo una nota.)

Puoi fare qualcosa di simile a quanto segue in python:

import hmac
print hmac.HMAC('secretkey', 'What is the air speed velocity of an unladen swallow?').hexdigest()

Quale dà 0e348e81ee5460ef138f7ec3ac9431de come risultato. Senza secretkey , un utente malintenzionato non può riprodurre questo. Ovviamente è possibile racchiuderlo in un piccolo script per renderlo più facile da usare.

OTOH, la soluzione comune a questo problema è quella di memorizzare le risposte in un gestore di password. Ho usato risposte piuttosto profane (più o meno estranee alla domanda) per domande di sicurezza - mi sono fermato dopo la prima volta che ho chiamato una banca e volevano che la risposta che avevo configurato online fosse stata loro comunicata per telefono.

    
risposta data 07.01.2018 - 21:34
fonte
1

C'è molto da fare con le firme GPG; NON lo userei assolutamente per questo scopo.

Come accennato da @David, un HMAC è un modo ragionevole per gestirlo; openssl dalla riga di comando può farlo; Suggerirei che openssl è un'alternativa ragionevole a gpg.

echo -n 'What is the air speed velocity of an unladen swallow?' | openssl dgst -sha512 -hmac MyKeyForAll

dà, per me

  4e423843133900407cab86527c7f17cd231cfa51a8bd21fdd8ff99aca2af19b9bbbc46c331326f712c25fab244ec5827d6430d5939c054b407010f1a470f9696

e dovresti anche, su qualsiasi computer, su qualsiasi software compatibile con RFC 2104 che supporti HMAC-SHA-512 (supponendo che la codifica dei byte sia identica).

La modifica della password o del tasto cambia drasticamente il risultato.

Un metodo superiore è PBKDF2 o un'altra tecnica iterata correttamente; In particolare, PBKDF2 si basa su una iterazione corretta di un HMAC!

In mio repository Github ho diverse implementazioni di PBKDF2 che funzionano con Windows e Linux (in varie lingue e con varie librerie).

In questi esempi, è possibile aumentare il numero di iterazioni per costringere un utente malintenzionato a impiegare più sforzi su ciascuno dei propri tentativi. Ad esempio:

  pbkdf2 -a SHA-512 -p "What is the air speed velocity of an unladen swallow?" -s MyKeyForAll -i 1310720 -o 64

richiede circa 2 secondi sul mio portatile usando il mio eseguibile basato su OpenSSL e genera

  b45dc81933b8221ac69785f867e1ddedf6954e99f14a28bf41bd2f5f5f590e589f6b3b9f129c9cc9863deb412872fd8137478c729b5c01f5ac258699c0d5b141

proprio come ogni altra implementazione PBKDF2-HMAC-SHA-512 valida (in quantità variabile di tempo - PolarSSL e CSharp richiedono entrambi circa 3 volte di più)

Un po 'di gioco con qualsiasi codice sorgente dovrebbe comportare la possibilità di generare l'uscita Base64, se lo desideri.

In ogni caso, la password o la chiave / sale DEVE essere una lunga stringa casuale.

Un'opzione ancora più valida è usare qualcosa come Keepass per generare password casuali lunghe per ogni esigenza che hai e faccelo copiare / incollare / autotype per te.

    
risposta data 08.01.2018 - 07:44
fonte