Qual è il numero massimo di byte che possono estrarre dal SecureRandom CSPRNG di Java prima di dover reseed

voti
3

Io sono l'attuazione di un programma in Java e sto usando SecureRandom per la generazione di casualità. Ho bisogno di essere in grado di crittografare 1 miliardo di file. Ho guardato su StackOverflow per la risposta della mia domanda, ma non ho trovato risposte precise. Ognuno è piuttosto vago:

  • Non è necessario a reseed SecureRandom. Ha un periodo di “grande”. Ma ciò che è grande ?
  • Non è necessario a reseed SecureRandom perché è un CSPRNG “ben progettato. Ma che cosa è un ben progettato periodo di CSPRNG?

Così ho deciso di fare la matematica me stesso e vedere se qualcuno può controllare per me. Quali fatti sappiamo di attuale implementazione di SecureRandom in Java 8? In realtà v'è una certa polemica dalle fonti che ho trovato.


Quello che so di implementazione SecureRandom di Java

  • Internamente utilizza SHA1PRNG quando genera casualità tramite le chiamate a nextBytes(), nextInt(), nextLong()ecc (vedi Tersesystems , Cigital ).

    La spiegazione di ciò che Cigital SecureRandom fa sotto il cofano è in contraddizione con la spiegazione ufficiale dai documenti Java . La documentazione ufficiale da Oracle afferma che NativePRNG, NativePRNGBlocking, NativePRNGNonBlocking e Windows-PRNG utilizzano sempre la fonte originaria di casualità, invece di algoritmo SHA1PRNG proprio Java (citato anche da questa risposta e questo uno ). Link di Cigital dice che Java utilizza sempre SHA1PRNG, ma il tipo di SecureRandom impone dove è seminato da ( /dev/random, /dev/urandomecc).

    È SecureRandom sempre usando SHA1PRNG sotto il cofano? Questo è quello che presumo nei miei calcoli matematici quindi se questo non è il caso per favore correggetemi.

  • Gli ufficiali documenti di Oracle dichiarano che SHA1PRNG tronca la sua uscita a 64 bit, dalla completa uscita hash 160 bit? Guardando la realizzazione di OpenJDK di SecureRandom vedo nulla un troncamento dell'uscita SHA1. In realtà fa il contrario: salva qualsiasi uscita non utilizzato dalla hash SHA1 per il futuro chiama engineNextBytes(). Se i documenti ufficiali Oracle sono la principale autorità in materia allora perché l'implementazione di OpenJDK fa qualcosa di diverso? Questo è strano.

  • Quando nextBytes()viene chiamato immediatamente nell'istanza SecureRandom, è testa di serie automaticamente dal CSPRNG del sistema operativo ( /dev/randomin Linux / Unix e CryptGenRandom in Windows) o quando questi non sono disponibili da generatori di entropia su misura come ThreadLocalRandom . Ma ThreadLocalRandom offre molto basso e lento entropia quindi dovrebbe essere evitato quando possibile.

  • Da nessuna parte ho visto la prova di funzionalità risemina automatico SecureRandom. La Fortuna CSPRNG, come spiegato in Cryptography Ingegneria, ha un elaborato meccanismo di risemina e mi aspetto che ogni CSPRNG moderna sarebbe astratto che la logica da parte del cliente e di gestire automaticamente. Non sono sicuro perché c'è una tale mancanza di informazioni e di comprensione circa CSPRNG risemina. Ha bisogno di accadere se si esaurisce il periodo della CSPRNG. Non v'è alcun dubbio. La domanda è: qual è il periodo ed è una preoccupazione reale in Java.


Facendo due conti

A causa l'attacco di compleanno sappiamo che dovremmo ottenere generalmente una collisione quando si produce la metà delle dimensioni di uscita del numero di hash interna di uscite. Sappiamo che l'hash interna viene troncato a 64 bit. Questo significa che siamo in grado di generare al massimo 2 ^ 32-1 giri di 64 bit casualità prima che abbiamo una probabilità del 50% di collisione. Questa sarà la volta vogliamo reseed.

(2 bit di casualità per sementi di SecureRandom

Convertito in byte che otteniamo

(2 GByte di casualità per ogni seme di SecureRandom.

Ciò significa che possiamo aspettarci in genere intorno 33.55GB di casualità di alta qualità generato da SHA1PRNG di SecureRandom prima di dover essere riseminate con un seme forte.

È la mia matematica è corretto?

Perché è importante? Perché il mio caso d'uso è nella cifratura 1 miliardo di file. Ognuno ha bisogno di un IV (128 bit) e una chiave (256 bit) o ​​384 bit. Questo esce a 46.875GB di casualità necessario nel migliore dei casi. A causa di questo io scarico periodo di SecureRandom se detto periodo è solo 33.55GB. Una strategia di risemina sarà necessario in questo caso, che vi posterò come una questione separata.

Il mio problema con collisioni e SecureRandom

Ho molto da imparare sulla crittografia così la mia comprensione sta migliorando tutto il tempo. Non ho trovato alcuna informazione su collisioni essere un problema per CSPRNG, ma indovinare lo stato interno del generatore è dannoso (vedi Wiki e Schneir della carta crittoanalisi su CSPRNG ).

Qui è la mia linea di pensiero per le collisioni, però. I generare una tabella di (2 ^ 32-1) unici valori di bit casuali, 64 (questo risulta essere ~ 33.55GB così bella realizzabile). Poi ho il 50% di probabilità di indovinare qualsiasi uscita a 64 bit di SecureRandom. Un IV / chiave, per esempio, è costituito da 2 x 64 = 128 bit. Ciò significa che posso indovinare i primi 64 bit del IV / Chiave con 50% di probabilità ed i secondi 64 bit con 50% di probabilità, senza dover conoscere lo stato interno del CSPRNG. La probabilità combinata di indovinare la chiave completo sarà inferiore al 50%, ma molto di più il trascurabile probabilità siamo di fronte a quando si lavora con tali primitive crittografiche. Questo può portare alla generazione di chiavi deboli che è quello che sto cercando di evitare. In altre parole, credo che l'uscita a 64 bit di un CSPRNG è troppo piccolo per il lavoro di crittografia serio, basata esclusivamente sulle proprietà di collisione di un'uscita a 64 bit (a causa dell'attacco di compleanno). Se, d'altra parte, SecureRandom stava usando uno SHA-2 hash 512 bit e troncato a 256 bit in uscita, allora l'attacco di collisione sto teorizzando qui sarebbe impossibile a causa della vastità dello spazio chiave. Sto facendo senso o ho ottenuto tutto questo male?

È pubblicato 22/06/2016 alle 11:33
fonte dall'utente
In altre lingue...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more