it-swarm.dev

OpenVPN dhparam

Uno dei passaggi per l'impostazione OpenVPN è l'esecuzione del comando openssl dhparam -out dh1024.pem 1024. La pagina man mi dice questo 1024 valore si riferisce al numero di bit.

  • Perché è il valore 1024 suggerito dagli esempi?
  • Dovrei usare un valore più grande come 4096?
    • Quale valore devo usare, quanti bit sono sufficienti, perché?
    • Le chiavi RSA a 1024 bit sono ora considerate deboli e si suggerisce spesso di utilizzare 2048 bit o superiore. Questo tipo di situazione si applica anche a questo file dhparam?
  • Il comando per generare questo file sembra richiedere circa 10 ore sull'appliance I che userò come server OpenVPN. È sicuro generare questo file su una macchina più veloce e trasferirlo o dovrei trattarlo come la maggior parte delle chiavi private e tenerlo solo su quell'host? Quanto deve essere segreto questo file?
18
Zoredache

Gran parte di questo è stato affrontato in precedenza. Vedi la mia risposta e la risposta di Thomas a una domanda correlata per maggiori informazioni sui parametri DH e DH.

I parametri sono solo numeri primi, non chiavi. Non devono essere univoci o segreti, ma non devono nemmeno essere appositamente realizzati da un attaccante. La lunghezza del bit si riferisce alla dimensione del prime non a chiave, quindi non è direttamente paragonabile a RSA. Nota che una chiave RSA di 2048 bit è composta da una coppia di numeri primi a 1024 bit, quindi sei allo stesso livello rispetto alla fattorizzazione con un DH primo a 1024 bit rispetto a una chiave RSA 2048.

Come sottolinea la risposta di Thomas collegata sopra, il numero non deve essere unico o segreto, e in effetti la tua libreria di criptovalute potrebbe fornire un numero primo di DH che funzionerà perfettamente (supponendo che ti fidi della fonte della libreria). Oppure puoi generarne uno tu stesso.

Ulteriori dettagli alla luce delle recenti scoperte

Prima di tutto, i consigli sulla dimensione principale sono in gran parte ancora corretti - 512 è troppo piccolo e 1024 è probabilmente abbastanza buono(si applicano alcuni avvertimenti) mentre il 2048 è sicuramente sicuro.

Inoltre, tuttavia, è stato dimostrato un attacco di pre-calcolo in modo tale che se si conoscono i numeri primi in anticipo, è possibile eseguire la maggior parte del lavoro di cracking di un determinato scambio di DH in anticipo. È un sacco di calcoli e richiede una grande quantità di tempo per calcolare tutti i possibili vettori per un dato set di numeri primi, ma se un singolo set di numeri primi viene utilizzato ovunque, allora c'è un incentivo a spendere tempo e denaro perché il risultato sarà essere così ampiamente utile.

Ciò significa che usare gli stessi numeri primi di tutti gli altri è una sorta di responsabilità, perché è più probabile che il tuo pre-calcolo sia stato fatto dal tuo aggressore. Quindi probabilmente vorrai generare i tuoi numeri primi unici per tenerti fuori dal pool di attacchi. Inoltre, se tu stesso sei un bersaglio così attraente che un avversario è disposto a spendere milioni al mese per attaccarti (ad esempio obiettivi di dimensioni di Facebook), può essere giustificato ruotare i numeri primi su base regolare.

Per quanto riguarda il costo e lo sforzo necessari per eseguire questo precomputazione, il lavoro per i numeri primi a 512 bit può essere svolto da un individuo dedicato, per i numeri primi a 1024 bit da uno stato-nazione, e per i numeri primi a 2048 bit da forse una civiltà aliena avanzata.

12
tylerl

La sicurezza DH si basa sulla durezza di Logarithm discreto . Per un numero primo scelto casualmente p , tale durezza aumenta con la dimensione di p , utilizzando gli algoritmi più noti. Per qualche strana ragione, capita che l'algoritmo più noto per il logaritmo discreto abbia molto in comune con l'algoritmo più noto per la fattorizzazione dei numeri interi ( GNFS ) e lo stesso costo di gestione asintotico. Pertanto, un modulo primo a 1024 bit per DH fornisce un livello di sicurezza molto approssimativamente equivalente a quello di una chiave RSA a 1024 bit.

Se guardiamo ai dettagli, un modulo a 1024 bit è un po 'più forte di una chiave RSA a 1024 bit, perché attraverso il logaritmo GNFS per discreto e il fattore GNFS per fattorizzazione sono molto simili, il loro passaggio finale (algebra lineare in una matrice enorme) è più difficile per DL (il collo di bottiglia è la dimensione della matrice; per la fattorizzazione, gli elementi della matrice sono bit singoli, mentre per DL sono numeri interi modulo) p , ovvero mille volte più grande). Fino ad oggi RSA-1024 è ancora ininterrotto e DH 1024 bit ancora di più.

Tuttavia rompere DH a 1024 bit non è del tutto irrealistico; ci vorrebbe una quantità non trascurabile di dollari (miliardi) e la costruzione di una macchina dedicata, per scopi speciali, e il tempo di funzionamento verrebbero comunque conteggiati in mesi o addirittura anni. Ma ciò è fattibile senza invocare aiuto da concetti di fantascienza (utili alieni "molto avanzati") o teologia (utili divinità). In tal senso, sì, dovresti cercare di utilizzare un modulo più grande.


Non si desidera utilizzare un modulo sovradimensionato perché il costo della CPU di utilizzo aumenta in modo piuttosto netto con tale dimensione (dovrebbe dovrebbe aumentare in modo quadratico, ma per alcune implementazioni è piuttosto cubico, ovvero 4096 bit che costano 8 volte più di 2048 bit). 2048 bit vanno bene.

Un ulteriore e piuttosto fastidioso problema è che ci sono alcune implementazioni diffuse di SSL che non supportano il modulo DH maggiore di 1024 bit. Se si utilizza OpenVPN, si sa che sia il client che il server sono OpenVPN, quindi non si dovrebbero avere problemi di interoperabilità.

Il primo p e il generatore g non sono segreti; possono anche essere condivisi. Vedi questa risposta per i dettagli. Puoi generarli perfettamente su qualche macchina e usarli su un altro. È inoltre possibile impostare tutti gli apparecchi in modo che utilizzino gli stessi parametri DH; questo non implica alcun problema di sicurezza aggiuntivo.


La generazione dei parametri DH con OpenSSL può richiedere molto tempo perché OpenSSL insiste, senza valide ragioni razionali, a generare i cosiddetti "numeri primi sicuri", ovvero un numero primo p tale che (p-1)/2 è anche un numero primo. Questo è eccessivo e moltiplica il tempo di generazione per un fattore enorme (diverse centinaia). Ciò che è necessario per DH è che p è primo e p = qr + 1 per alcuni abbastanza grandi q ; un 256-bit q andrebbe già abbastanza bene. Passare a un "numero primo sicuro" (ovvero q di dimensioni 1023 bit per un 1024 bit p ) non rende le cose più sicure, nonostante il nome (questo è un pezzo di vecchia tradizione che si è trasformato in un mito a causa della scarsa terminologia).

I "numeri primi sicuri" hanno un vantaggio in termini di prestazioni minori (in base all'utilizzo, non in base alla generazione) in quanto consentono l'uso di g = 2 come generatore; ma questo vantaggio è lieve (è importante solo per metà dello scambio di chiavi DH, ed è per lo più annullato da ottimizzazioni basate su finestre sull'esponenziazione modulare).

Se davvero volessi generare parametri DH su ogni apparecchio (il che non è utile), allora potresti aggiungere il flag "-dsaparam "alla riga di comando per generare parametri DH senza insistere per avere" numeri primi sicuri ":

openssl dhparam -dsaparam -out dh2048.pem 2048

Questo dovrebbe essere molto più veloce. Ma generare i parametri DH su un PC e codificarli semplicemente in tutti i tuoi apparecchi è ancora più semplice ed è sicuro.

5
Tom Leek