2014-09-12 6 views
11

Ho letto che, generalmente, some implementations of SecureRandom may produce true random numbers.L'implementazione Android di SecureRandom produce numeri casuali veri?

In particolare, il Android docs dire

istanze di questa classe genera un seme iniziale utilizzando una sorgente di entropia, come/dev/urandom

ma significa produrrà numeri casuali veri (cioè, piuttosto che numeri pseudo-casuali)?

E se uso SecureRandom in Android in questo modo ...

SecureRandom sr = new SecureRandom();

... Riceverò un'uscita veramente casuale ogni volta che io chiamo sr.nextBoolean()?

O è probabile che l'output sia più (o meno?) Casuale se io, invece, ottengo l'output facendo ciò ogni volta: new SecureRandom().nextBoolean()?

+1

Questo non è * necessariamente * vero in quanto alcuni dispositivi Android non dispongono dell'hardware per generare un numero casuale * true *. Per quanto riguarda i dispositivi * con * che l'hardware userà, non lo assumerei, anche se il kernel Linux potrebbe caricare un modulo che ottiene numeri casuali veri da tale hardware. – hexafraction

+1

AFAIK tutte le implementazioni utilizzano forme diverse o hashing algoritmico. Pur avendo buone proprietà matematiche, non sono veramente casuali. –

+1

Da [Blog degli sviluppatori Android] (http://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html): * "Abbiamo ora stabilito che le applicazioni che utilizzano Java Cryptography Architecture (JCA) per la generazione di chiavi, la firma o la generazione di numeri casuali potrebbero non ricevere valori crittografici forti sui dispositivi Android a causa dell'inadeguata inizializzazione del PRNG sottostante ... "*. Dopodiché, credo che AOSP passi al generatore di OpenSSL. Il cambiamento si è verificato in [Jelly Bean] (http://android-developers.blogspot.com/2013/02/security-enhancements-in-jelly-bean.html). – jww

risposta

0

La risposta chiave è che/dev/urandom, come defined by the linux kernel, è garantito non bloccare. L'accento è posto sul non arrestare l'utente mentre viene generata sufficiente entropia. Se i documenti android dicono che stanno iniziando l'inizializzazione di/dev/urandom, E c'è un'entropia insufficiente nel kernel per fornire numeri casuali, il kernel ricadrà su un algoritmo pseudo-casuale.

Per la documentazione del kernel,/dev/urandom è considerato sufficiente per quasi tutti gli scopi eccetto "chiavi a lunga vita [crittografia]". Data la descrizione del tuo uso previsto, sospetto che Android SecureRandom si riveli abbastanza casuale per i tuoi scopi.

+1

Android è una specie di bestia distinta. Ha '/ dev/urandom', ma non credo che Android' SecureRandom' e 'SecureRandomSpi' lo stessero usando. Invece, il seme era veramente debole - essenzialmente era proprietà di sistema (come numero seriale, versione in banda base), tempo (milli e nano secondi) e la stringa * "Tutto il tuo caso ci appartiene" *. Controlla [EntropyService.java] (https://code.google.com/p/android-source-browsing/source/browse/services/java/com/android/server/EntropyService.java?repo=platform--frameworks --base & name = b8cba95f & r = 6907891b1f2d706fa2bd6c40b986f73e5666e00e). – jww

3

I numeri casuali "veri" e "pseudocasuali" indicano un sacco di cose diverse per persone diverse. È meglio evitare quelli.

/dev/urandom ha ottenuto una cattiva reputazione perché le persone non capiscono le differenze tra esso e/dev/random (molto, molto meno differenza di quanto ci si aspetterebbe).

Se si sta chiedendo se il seeding di/dev/urandom possa compromettere l'idoneità di SecureRandom a utilizzarlo per scopi crittografici, la risposta è un clamoroso "no".

Se hai un po 'di tempo potresti leggere lo my essay sull'intero problema.

+1

Hiya Thomas, penso che tu abbia un errore di battitura lì dentro, uno degli urandom. (E, no, questo non è per scopi crittografici.) –