Implementazione di diceware: devo simulare il lancio dei dadi?

14

Sto creando una piccola utility per generare password basate sul metodo diceware. Al momento sono molto vicino all'algoritmo del vero diceware - cioè simulo il lancio di dadi n-times per ottenere una singola parola dalla lista.

Mi chiedo se questo sia veramente necessario. Non sarebbe sufficiente ottenere un numero casuale tra 0 e length(diceware_list) -1 per ottenere una singola parola?

Un tale approccio semplificato influirebbe sulla sicurezza della password generata? (Sto usando fonti crittografiche sicure di numeri casuali, quindi questo non è un problema).

Penso che il metodo semplificato dovrebbe essere ok, ma non sono sicuro. Qualcuno potrebbe aiutarmi, per favore?

    
posta MaciekTalaska 21.05.2018 - 16:46
fonte

4 risposte

29

La ragione per cui Diceware sostiene che usare i dadi per selezionare una password è che garantisce che la password che l'utente ottiene sia casualmente . Quindi no, finché sei certo che il tuo programma stia selezionando la password in un modo imprevedibile (selezione casuale crittograficamente sicura con una distribuzione uniforme), non importa come sia effettivamente generata la password.

Ci sono altri motivi per usare dadi che è impossibile replicare in qualsiasi programma:

  1. È completamente trasparente per l'utente. Non devono affidarsi a un programma per computer per utilizzare un generatore di numeri casuali crittograficamente appropriato o per non divulgare la propria password ad attori malintenzionati.
  2. 100% a prova di malware. A meno che tu non abbia una webcam puntata verso il tuo tavolo mentre stai tirando i dadi, è fisicamente impossibile per un programma dannoso sul tuo PC osservare o influenzare la password che stai generando.

A meno che i tuoi utenti non siano particolarmente paranoici, ci sono buone probabilità che vadano bene a rinunciare a questi benefici a favore della maggiore praticità di generare una nuova password immediatamente.

    
risposta data 21.05.2018 - 17:21
fonte
15

Sì, va benissimo. Con un buon PRNG, ogni elemento avrà esattamente le stesse probabilità di essere scelto, se si esegue correttamente la limitazione (da 1 a n). (Ho fatto personalmente un'implementazione diceware che fa esattamente questo .)

Ci sono due semplici motivi in cui si usano più dadi in un processo diceware fisico:

  1. I dadi a 6 facce sono onnipresenti ed economici.
  2. Un dado a 7776 facce (6 ^ 5), a mia conoscenza, non esiste. Sarebbe anche imbarazzante rotolare se abbastanza grande da leggere, o difficile da leggere se abbastanza piccolo da rotolare nel modo tradizionale.

Si noti che ho detto "se si esegue correttamente la limitazione (da 1 a n)". Se la tua biblioteca di generazione di numeri casuali non offre una primitiva da 1 a n, fai non semplicemente prendi un valore più grande e modulo n! Mentre questo darà risposte nell'intervallo corretto, esse non saranno distribuite uniformemente. Dovresti:

  1. Continua a riprovare finché non viene restituito un valore nell'intervallo accettabile (ad esempio, elimina tutti i valori > n)
  2. Scala linearmente: rand_val * n / rand_max (che richiede matematica di precisione arbitraria per evitare errori di arrotondamento)
risposta data 21.05.2018 - 17:23
fonte
3

La risposta di Ajedi32 è ottima. Volevo sottolineare un dettaglio che può aiutare a rispondere meglio alla tua domanda. La chiave per proteggere la generazione di password è assicurarsi che la tua password sia imprevedibile . Non "casuale". L'idea di casuale viene dopo. L'obiettivo è imprevedibile. Se ci pensate, la password più sicura esistente non è casuale, è qualunque sia l'ultima password che l'utente malintenzionato potrebbe indovinare. È quello che non potevano prevedere.

Ora, in pratica, c'è una partita di gatto e topo qui. Se si tenta di trovare la password più imprevedibile, proveranno a prevedere come si generano le password. Questo è il motivo per cui le password come qazxswedc appaiono casuali, ma una volta che hanno capito cosa stavi facendo per generare la password, la interromperanno facilmente.

È qui che entra in gioco la casualità. Per la crittografia moderna, ci sforziamo di utilizzare numeri che non sono solo imprevedibili per l'aggressore, ma imprevedibili per chiunque , incluso te stesso! I numeri casuali sono numeri che letteralmente non possono essere previsti in alcun modo. Puoi solo sapere quali numeri sono stati scelti se stavi guardando quando i numeri sono stati generati. Casualità significa che puoi fare affermazioni matematiche su quanto sia difficile predire una password, perché nemmeno tu stesso hai avuto il controllo della generazione.

Per migliaia di anni, i dadi sono stati una fonte "standard" di numeri casuali. Ce ne sono molti altri (la divinazione di I Ching, ad esempio, usava tradizionalmente un fascio di bastoncini di achillea), ma i dadi sono rimasti a lungo. Se proiettati correttamente (senza elicotteri!), Sono fonti di numeri casuali sufficientemente buone perché il rimbalzo del dado è altamente caotico e imprevedibile. Avresti bisogno della telecinesi per influenzare i risultati (pensa Star Wars: The Phantom Menace).

Se sei preoccupato per i dadi caricati, come indicato da alcuni nei commenti, puoi effettivamente fare analisi statistiche per determinare quanti bit di entropia per rotolo puoi effettivamente contare. La generazione di password è meno sensibile ai dadi caricati rispetto ai casinò (puoi sempre fare rotoli extra, moltiplicando il numero di possibilità.) Perché i casinò distribuiscono denaro, non si moltiplicano a turno, devono aggiungere. sensibile).

Quindi ora possiamo avvicinarci alla tua domanda, perché capiamo cosa stai cercando di realizzare. Simulare i dadi in realtà non funziona come potresti pensare, perché la simulazione farà la stessa cosa ogni volta, a meno che tu non abbia una fonte di casualità incorporata nella simulazione, che tipo di sconfigge il punto.

La domanda è: quale fonte casuale puoi fidarti? Qui è dove devi capire il tuo modello di minaccia. Cosa può fare il tuo aggressore? Il tuo aggressore può leggere le tue battute? Se è così, sei nei guai perché dovrai digitare la password. Quindi, in pratica, possiamo supporre che l'attaccante non abbia abbastanza controllo sulla tua macchina per poter leggere le sequenze di tasti.

Puoi continuare a lavorare da lì. La mia ipotesi è che il modello delle minacce presuma che il tuo computer sia integro, nel qual caso puoi contare su fonti di entropia testate nel tempo, come /dev/random . In questo caso, la migliore risposta è trarre da quella fonte e usarla direttamente (non è richiesta la simulazione dei dadi).

Se sei più interessato alla sicurezza, puoi guardare ad altri aspetti. Alcuni algoritmi hanno problemi con gli attacchi di canale laterale che consentono a un utente malintenzionato di accedere al proprio stato in alcune circostanze specializzate, pertanto è possibile rafforzare l'algoritmo rispetto a quelli. Potresti decidere di non fidarti delle normali fonti di entropia su un computer (come il tempo tra le sequenze di tasti e l'attività di rete), quindi potresti investire in una fonte hardware di casualità (spesso costruita attorno al rumore in una rete di resistori). / p>

Ma non importa dove tu vada, ricorda che la chiave è essere imprevedibile, e il modo standard per assicurarti che il tuo avversario non possa prevederti è di essere così casuale da non poterti prevedere.

    
risposta data 22.05.2018 - 17:35
fonte
1

Un generatore di numeri casuali è considerato "pseudo casuale", non è veramente casuale in quanto è calcolato matematicamente. I dadi sono considerati veramente casuali, anche se suppongo che potresti argomentare che la fisica non è diversa ...

Simulando il lancio dei dadi a livello di codice, stai rimuovendo la casualità vera richiesta dal diceware. Quindi la tua confusione tra i dadi simulati e la selezione di una parola casuale, entrambi sono pseudo casuali.

    
risposta data 22.05.2018 - 18:39
fonte

Leggi altre domande sui tag