Per ottenere casualità, devi ottenere sufficiente entropia iniziale da alcuni eventi "veramente casuali", che provengono da sistemi fisici. Una volta che hai sufficiente entropia iniziale, puoi estenderla a tempo indefinito con un PRNG protetto da crittografia . Poiché il PRNG è un processo deterministico, il suo output non viene influenzato da qualsiasi altro processo possa essere eseguito contemporaneamente sulla macchina.
Il kernel del sistema operativo è in una posizione ideale per raccogliere quel seed iniziale, poiché ha accesso diretto all'hardware. Un buon sistema operativo raccoglierà gli eventi hardware per alimentare il suo pool interno ed eseguirà il PRNG e fornirà un'API per ottenere l'output PRNG. Su iOS, questo è SecRandomCopyBytes()
, che legge il file speciale /dev/random
(in iOS, come in OS X e FreeBSD, /dev/random
è identico a /dev/urandom
). Usandolo si sta già facendo bene; ha già tutta la sicurezza crittografica che puoi ragionevolmente sperare; la sua sicurezza non sarà influenzata dall'esecuzione di animazioni poiché il seed iniziale viene raccolto molto presto nel processo di avvio. Su Android, usa java.security.SecureRandom
- stessa discussione (usa% di% di% di Linux).
In tempi molto più antichi, alcune persone stavano parlando di applet Java, che, per definizione, erano in modalità sandbox e non potevano accedere al sistema operativo per ottenere una buona casualità. Queste applet dovevano quindi trovare eventi casuali da altre fonti, e l'unico rimasto era misurare la velocità con cui lo scheduler del SO poteva passare tra due thread (es. Vedi questo codice ). Quel metodo di filatura del filo richiedeva una macchina altrimenti in gran parte inattiva; in caso contrario, i numeri prodotti erano severamente non casuali. Altri metodi hanno sfruttato l'utente: hanno chiesto all'utente di muovere il mouse e l'applet avrebbe utilizzato le posizioni successive del puntatore come fonte di entropia.
Fortunatamente questi espedienti atroci sono cose del passato (o almeno speriamo ... perché a volte alcuni sviluppatori di sistemi bancari diventano "creativi"). Per un'app su uno smartphone, hai accesso ai servizi del sistema operativo, quindi usali e sii felice.