/dev/random: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Wiso (discussione | contributi)
inizio traduzione, work in progress
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti.
 
(38 versioni intermedie di 27 utenti non mostrate)
Riga 1:
Nei sistemi operativi [[Unix]] e [[Unix-like]], '''/dev/random''' (random device, dispositivo casuale) è un [[filedispositivo specialevirtuale]] (ossia non fisicamente presente su [[memoria di massa]]) con la caratteristica di restituire un valore [[numero casuale|valore numerico casuale]] o [[numeroNumeri pseudocasualepseudo-casuali|pseudo-casuale]] ogni volta che vi si accede. Consente di accedere al rumore ambientale raccolto dai [[dispositivoperiferica|dispositivi]] collegati e da altre sorgenti. /dev/random viene utilizzato per esempio per il test di [[applicazioni]] che operano su numeri casuali, o come sistema per individuare errori di programmazione ([[bug]]) su [[input]] casuali. Può essere impiegato anche per simulare il "rumore" (vale a dire la presenza di dati non corretti) nelle sequenze di input verso i [[driver]] di [[periferica]]. Un diverso utilizzo si ha nel campo della [[crittografia]] dove /dev/random può essere utilizzato per generare chiavi crittografiche casuali sia ad uso del [[sistema operativo]] che delle applicazioni.
{{S|Unix}}
 
Nei sistemi operativi [[Unix]] e [[Unix-like]], '''/dev/random''' (random device, dispositivo casuale) è un [[file speciale]] (ossia non fisicamente presente su memoria di massa) con la caratteristica di restituire un valore [[numerico casuale]] o [[numero pseudocasuale|pseudo-casuale]] ogni volta che vi si accede. Consente di accedere al rumore ambientale raccolto dai [[dispositivo|dispositivi]] collegati e da altre sorgenti. /dev/random viene utilizzato per esempio per il test di [[applicazioni]] che operano su numeri casuali, o come sistema per individuare errori di programmazione ([[bug]]) su [[input]] casuali. Può essere impiegato anche per simulare il "rumore" (vale a dire la presenza di dati non corretti) nelle sequenze di input verso i [[driver]] di [[periferica]]. Un diverso utilizzo si ha nel campo della [[crittografia]]dove /dev/random può essere utilizzato per generare chiavi crittografiche casuali sia ad uso del [[sistema operativo]] che delle applicazioni.
 
Non tutti i sistemi operativi implementano la stessa semantica per /dev/random. [[Linux]] è stato il primo sistema Unix-like a implementare /dev/random come generatore di numeri casuali. Implementazioni simili si trovano in [[FreeBSD]], [[Solaris (sistema operativo)|Solaris]], [[Mac OS X]], [[NetBSD]], [[OpenBSD]], [[Tru64|Tru64 UNIX 5.1B]], [[AIX (sistema operativo)|AIX 5.2]], e [[HP-UX|HP-UX 11i v2]]. Nei sistemi[[Windows]] della famiglia NT funzioni simili vengono svolte dal file ksecdd.sys.
 
 
Non tutti i sistemi operativi implementano la stessa semantica per /dev/random. [[Linux]] è stato il primo sistema Unix-like a implementare /dev/random come generatore di numeri casuali. Implementazioni simili si trovano in [[FreeBSD]], [[Oracle Solaris (sistema operativo)|Solaris]], [[Mac OS XmacOS]], [[NetBSD]], [[OpenBSD]], [[Tru64|Tru64 UNIX 5.1B]], [[AIX (sistema operativo)|AIX 5.2]], e [[HP-UX|HP-UX 11i v2]]. Nei sistemi [[Windows]] della famiglia NT funzioni simili vengono svolte dal file ksecdd.sys.
 
==Linux==
La generazione di numeri casuali dal [[kernel]] è stata implementata per la prima volta in [[Linux]]<ref>{{citeCita web|url=httphttps://www.randombit.net/bitbashing/security/syllable_dev_random.html |titletitolo=On Syllable's /dev/random |authorautore=Jack Lloyd |datedata=December 9, dicembre 2008 |accessdateaccesso=27 aprile 2009-04-27|archiveurlurlarchivio=httphttps://www.webcitation.org/5gOzG0qvc|archivedate?url=2009-04-29http://www.randombit.net/bitbashing/security/syllable_dev_random.html|deadurldataarchivio=no29 aprile 2009}}</ref> nel 1994 da [[Theodore Ts'o]].<ref>{{citeCita web |url=http://everything2.com/title/%252Fdev%252Frandom |titletitolo=/dev/random |datedata=June 8, giugno 2003 |publishereditore=everything2.com |accessdateaccesso=2009-04-27 aprile 2009 |archiveurlurlarchivio=httphttps://www.webcitation.org/5gOzGLECz|archivedate?url=2009-04-29http://everything2.com/title//dev/random |deadurldataarchivio=no29 aprile 2009 }}</ref>. L'implementazione usa [[SHA-1|hash sicuri]] al posto di un [[cifrario]] per evitare problemi legali che erano presenti al momento del progetto. L'implementazione tiene anche conto del fatto che un certo hash o cifrario potrebbe essere scoperto essere debole, e quindi il progetto è durabileprotetto contro ogni tale debolezza. <!--Fast recovery from [[pool compromise]] is not considered a requirement, because the requirements for pool compromise are sufficient for much easier and more direct attacks on unrelated parts of the operating system.-->
 
In questa implementazione, il generatore mantiene una stima del numero di [[bit]]s di rumore nella [[entropy pool]]. Da questa entropy pool i numeri casuali sono creati. Quando viene letto, <code>/dev/random</code> ritornarestituisce solo byte casuali llall'interno della stima del numero di bit di rumore nell'entropy pool. <code>/dev/random</code> può essere adatto per gli utenti che necessitano di una casualità di ottima qualità come per la creazione di [[one time pad]] o [[chiave pubblica|chiavi pubbliche]]. Quando l'entropy pool è vuota, la lettura di <code>/dev/random</code> si interrompe fino a quando non viene accumulato nuovo rumore ambientale.<ref>{{man|4|urandom}}</ref> Il motivo è di fornire un [[generatore di numeri pseudocasuale crittograficamente sicuro]], fornendo un output con un'entropia il più grande possibile.
 
Una controparte di <code>/dev/random</code> è '''/dev/urandom''' (sorgente causale non bloccata "unlocked" <ref>http[https://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html random(4) - Linux manual page<!-- Titolo generato automaticamente -->]</ref>) che riusa il pool interno per produrre bitsbit pseudocasuali aggiuntivi. Questo significa che la richiesta non si blocca, ma il risultato potrebbe contenere meno entropia rispetto a <code>/dev/random</code>. Nonostante sia un generatore di numeri pseudocasuali adatto per la maggior parte delle applicazioni crittografiche, non è raccomandato per la generazione di chiavi crittografiche a lunga scadenza.
 
È inoltre possibile scrivere su <code>/dev/random</code>. Questo consente ad ogni utente di mischiare i dati casuali all'interno del pool. L'attuale ammontare dell'entropia e la dimensione dell'entropy pool del kernel Linux è disponibile attraverso <code>/proc/sys/kernel/random/</code>.
 
Nel Marzomarzo 2006 Gutterman, Pinkas, & Reinman hanno pubblicato un'analisi dettagliata del generatore di numeri casuali di Linux<ref>{{citeCita web|url=http://www.pinkas.net/PAPERS/gpr06.pdf |titletitolo=Analysis of the Linux Random Number Generator |authorautore=Zvi Gutterman |coauthorsautore2=Benny Pinkas, Tzachy Reinman |datedata=March 6, marzo 2006 |formatformato=PDF |accessdateaccesso=2008-09-18 settembre 2008}}</ref> nel quale descrivono alcune debolezze. Probabilmente il problema più importante riportato è quello che si verifica con sistemi [[sitemasistema embedded|embedded]] o con i [[Live CD]] nel quale lo stato di bootupavvio del sistema è prevedibile e l'entropia disponibile dall'ambiente potrebbe essere limitata. Per i sistemi con [[memoria non volatile]], è raccomandato salvare qualche stato del generatore allo spegnimento in modo da poterlo usare come stato al successivo avvio. Nel caso dei [[router]] nei quali il traffico di rete rappresenta la sorgente primaria di entropia, gli autori notano che salvare lo stato tra riavvii "dovrebbe far richiererichiederebbe a un potenziale attaccante di spiare su tutto il traffico di rete" che passa per il router, e ottenere un accesso diretto allo stato interno del router. Questo problema è particolarmente critico nel caso di router wireless il cui traffico di rete può essere catturato a distanza, il quale puòed essere utilizzato per generare chiavi crittografiche.
 
 
==FreeBSD==
TheIl sistema operativo [[FreeBSD]] operatingimplementa systemuna implementsvariante a 256- bit variant of the dell'[[Yarrowalgoritmo algorithmYarrow]], intendedche toha providelo ascopo [[cryptographicallydi securefornire pseudorandomun number[[generatore generator|cryptographicallydi securenumeri pseudorandompseudocasuale streamcrittograficamente sicuro]]&mdash;this replacedche asostituisce previous Linuxil styledispositivo random devicedi Linux. UnlikeA thedifferenza Linuxdi <code>/dev/random</code>, thedi FreeBSDLinux, <code>/dev/random</code> devicedi neverFreeBSD blocks.non Itsè behaviorbloccante. isIl similarsuo tocomportamento theè Linuxsimile a <code>/dev/urandom</code>, anddi Linux e <code>/dev/urandom</code> onè FreeBSDcollegato is linked toa <code>/dev/random</code>.
 
L'algoritmo Yarrow è basato sull'assunzione che i moderni generatori di numeri pseudocasuali sono molto sicuri se il loro stato rimane sconosciuto all'attaccante. Mentre un metodo basato su una entropy pool è completamente sicuro se implementato correttamente, non rimane sicuro se la quantità di entropia viene sovrastimata ed è più debole di un generatore basato su un seme ben inizializzato. In alcuni casi un attaccante potrebbe avere un considerevole controllo sull'entropia, per esempio i server senza disco potrebbero prendere gran parte della propria entropia dalla rete, rimanendo così vulnerabili a un attacco man-in-the-middle. Yarrow mette molta attenzione nell'evitare che un pool sia compromesso e sul suo rapido ripristino. Il seme dell'algoritmo è periodicamente rigenerato; nei sistemi con bassa attività di rete e di disco, questo viene fatto dopo una frazione di secondo.
Yarrow is based on the assumptions that modern PRNGs are very secure if their internal state is unknown to an attacker, and that they are better understood than the estimation of entropy. Whilst entropy pool based methods are completely secure if implemented correctly, if they overestimate their entropy they may become less secure than well-seeded PRNGs. In some cases an attacker may have a considerable amount of control over the entropy, for example a diskless server may get almost all of it from the network&mdash;rendering it potentially vulnerable to man-in-the-middle attacks. Yarrow places a lot of emphasis on avoiding any pool compromise and on recovering from it as quickly as possible. It is regularly reseeded; on a system with small amount of network and disk activity, this is done after a fraction of a second.
 
InNel 2004, [[Landon Curt Noll]] testedtestò <code>/dev/random</code> thedi FreeBSD 5.2.1 versione ofconcluse '''/dev/random'''che andnon suggestedera thatcrittograficamente itsicuro wasperché notil cryptographicallysuo secureoutput because its outputaveva haddifetti multiplemultipli uniformitye flawsuniformi.<ref>{{citeCita web|titletitolo=How good is LavaRnd?: Detailed Description of Test Results and Conclusions |url=http://www.lavarnd.org/what/nist-test.html |datedata=22 Sepsettembre 2004 |workopera=LavaRnd |publishereditore=LavaRnd |accessdateaccesso=22 Dec.dicembre 2010}}</ref> SimilarSimili flawsdifetti werefurono foundtrovati innell'implementazione thedi <code>/dev/random</code> di [[Linux]] 2.4.21-20, [[Oracle Solaris (operatingsistema systemoperativo)|Solaris]] patch 8 patch 108528-18, ande [[Mac OS XmacOS]] 10.3.5 implementations of '''/dev/random'''.
 
FreeBSD alsofornisce providesinoltre supportsupporto forper un [[Generatore hardware randomdi numbernumeri generator]]s,casuali|generatore whichdi willnumeri replacecasuali Yarrow when presenthardware]].
 
== Altri sistemi operativi ==
==Other operating systems==
<code>/dev/random</code> e <code>/dev/urandom</code> sono disponibili su [[Oracle Solaris (sistema operativo)|Solaris]], [[macOS]], [[NetBSD]], [[OpenBSD]], [[UNIX 5.1B]], [[AIX 5.2]] e [[HP-UX 11i v2]]. Come in FreeBSD, AIX implementa un proprio algoritmo Yarrow. Tuttavia AIX usa una quantità di entropia considerevolmente minore dello standard e smette di riempire il pool quando pensa che contenga abbastanza entropia.<ref>{{Cita web|url=https://lists.gnupg.org/pipermail/gnupg-devel/2003-April/019954.html |titolo=AIX 5.2 /dev/random and /dev/urandom devices |editore=Lists.gnupg.org |autore=Iain Roberts|data=25 aprile 2003 |accesso=18 settembre 2008}}</ref>
<code>/dev/random</code> and <code>/dev/urandom</code> are also available on [http://blogs.sun.com/yenduri/entry/dev_random_in_solaris Solaris], [http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man4/random.4.html Mac OS X], [http://netbsd.gw.com/cgi-bin/man-cgi?rnd++NetBSD-current NetBSD], [http://www.openbsd.org/cgi-bin/man.cgi?query=srandom&apropos=0&sektion=4&manpath=OpenBSD+Current&arch=i386&format=html OpenBSD],
[http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V51B_HTML/MAN/MAN4/0199____.HTM Tru64 UNIX 5.1B],
[http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.files/doc/aixfiles/random.htm#idx927 AIX 5.2],
and
[http://software.hp.com/portal/swdepot/displayProductInfo.do?productNumber=KRNG11I HP-UX 11i v2]. As with FreeBSD, AIX implements its own Yarrow-based design, however AIX uses considerably fewer entropy sources than the standard <code>/dev/random</code> implementation and stops refilling the pool when it thinks it contains enough entropy.<ref>{{cite web|url=http://lists.gnupg.org/pipermail/gnupg-devel/2003-April/019954.html |title=AIX 5.2 /dev/random and /dev/urandom devices |publisher=Lists.gnupg.org |author=Iain Roberts |date=April 25, 2003 |accessdate=2008-09-18}}</ref>
 
In [[Windows NT]], similaruna functionalityfunzione issimile deliveredè byfornita da <code>ksecdd.sys</code>, butma readingla thelettura specialdel file speciale <code>\Device\KsecDD</code> doesnon notfunziona work ascome in UNIX. TheI documentedmetodi methodsdocumentati toper generategenerare cryptographicallybytes randomcrittograficamente bytessicuri aresono [[CryptGenRandom]] e [[RtlGenRandom]].
[[CryptGenRandom]] and [[RtlGenRandom]].
 
WhileAnche se [[DOS]] doesn'tnon naturallyimplementa providenativamente suchuna functionalityfunzionalità theresimile isci ansono opendriver sourceda third-partyterze driverparti calledchiamati [http://www.rahul.net/dkaufman/index.html Noise.sys] whichche functionscreano similarlydue indispositivi, that it creates 2 devices, <code>RANDOM$</code> and <code>URANDOM$</code>, whichche aresono alsoanche accessibleaccessibili asda <code>/DEV/RANDOM$</code> and <code>/DEV/URANDOM$</code>, that programs can access for random data.
 
== EGD ascome analternativa alternative==
AIl software program called '''EGD''' (entropy gathering daemon) isè aun'alternativa commoncomune alternativeper fori sistemi Unix systems which do notche supportnon thesupportano <code>/dev/random device</code>. È It is a [[user space]]un [[DaemonDemone (computer softwareinformatica)|daemonDemone]] whichche providesfornisce highdati qualitycasuali cryptographicdi randomqualità datacrittografica. Some cryptographicAlcuni software suchcrittografici ascome [[OpenSSL]], [[GNU Privacy Guard]], and thee [[Apache HTTP Server]] support usingusano EGD when aquando <code>/dev/random</code> device isnon notè availabledisponibile.
 
[http://egd.sourceforge.net/ EGD], oro ala compatiblecompatibile alternativealternativa such as [http://prngd.sourceforge.net/ prngd], gatherraccolgono entropia pseudo-random entropycasuale fromda variousvarie sourcessorgenti, processle itprocessano toper removerimuovere biasdistorsioni ande improvemigliorare cryptographicla quality,qualità andcrittografica thene makele itrendono availabledisponibili overtramite aun [[Unix ___domain socket]] (with '''/dev/egdedg-pool''' beingè auna commonscelta choicecomune), oro overattraverso aun [[Internet socket|TCP socket]]. L'accumulo Thedell'entropia entropydi gatheringsolito usually entails periodicallycomporta [[Forkfork (operating systemprogrammazione)|forkingfork]] subprocessesdi tosottoprocessi queryperiodici attributesper ofinterrogare thegli systemattributi thatdel aresistema likelyche totipicamente becambiano frequentlyfrequentemente changinge andsono unpredictableimpredicibili, suchcome as monitoringla [[CPU]], l'I/O, andl'utilizzo networkdella usagerete ase wellil ascontenuto thedi contentsvari offile variousdi log files ande [[Temporary folder|temporary directoriesdirectory]] temporanee.
 
== Note ==
EGD communicates with other programs which need random data using a simple [[Protocol (computing)|protocol]]. The client connects to an EGD socket and sends a command, identified by the value of the first [[octet]]:
<references />
* command 0: query the amount of entropy currently available. The EGD daemon returns a 4-byte number in [[Endianness|big endian]] format representing the number of random bytes that can currently be satisfied without delay.
* command 1: get random bytes, no blocking. The second byte in the request tells EGD how many random bytes of output it should return, from 1 to 255. If EGD does not have enough entropy to immediately satisfy the request, fewer bytes, or perhaps no bytes may be returned. The first octet of the reply indicates how many additional bytes, those containing the random data, immediately follow in the reply.
* command 2: get random bytes, blocking. The second byte tells EGD how many random bytes of output it should return. If EGD does not have enough entropy, it will wait until it has gathered enough before responding. Unlike command 1, the reply starts immediately with the random bytes rather than a length octet, as the total length of returned data will not vary from the amount requested.
* command 3: update entropy. This command allows the client to provide additional entropy to be added to EGD's internal pool. The next two bytes, interpreted as a 16-bit big endian integer indicate how many bits of randomness the caller is claiming to be supplying. The fourth byte indicates how many additional bytes of source data follow in the request. The EGD daemon may mix in the received entropy and will return nothing back.
 
==See alsoVoci correlate ==
* [[Unix philosophy]]
* [[Standard streams]]
* <ttkbd>[[:/dev/full]]</ttkbd>
* <ttkbd>[[:/dev/null]]</ttkbd>
* <ttkbd>[[:/dev/zero]]</ttkbd>
* <ttkbd>[[:/dev]]</ttkbd>
* [[Generatore hardware di numeri casuali]]
* [[Hardware random number generator]]
* [[Generatore di numeri pseudocasuali crittograficamente sicuro]]
* [[Cryptographically secure pseudo-random number generator]]
* [[YarrowAlgoritmo algorithmYarrow]]
* [[FortunaAlgoritmo (PRNG)|Fortuna algorithm]]
 
== Collegamenti esterni ==
==Notes==
* [{{cita web|http://msdn2.microsoft.com/en-us/library/aa379942.aspx |CryptGenRandom]}}
{{reflist}}
* [{{cita web|http://msdn2.microsoft.com/en-us/library/aa387694.aspx |RtlGenRandom]}}
 
* [https://web.archive.org/web/20110614015324/http://www.suse.de/~thomas/papers/random-analysis.pdf Biege, Thomas; Analysis of a strong Random Number Generator] [https://web.archive.org/web/20110614015344/http://www.suse.de/~thomas/papers/23c3-random-analysis.pdf Slides]
==References==
{{morefootnotes|date=December 2010}}
* [http://msdn2.microsoft.com/en-us/library/aa379942.aspx CryptGenRandom]
* [http://msdn2.microsoft.com/en-us/library/aa387694.aspx RtlGenRandom]
* [http://www.suse.de/~thomas/papers/random-analysis.pdf Biege, Thomas; Analysis of a strong Random Number Generator] [http://www.suse.de/~thomas/papers/23c3-random-analysis.pdf Slides]
 
{{DEFAULTSORT:/Dev/Random}}
[[Category:Randomness|Dev Random]]
[[Category:Unix|Dev Random]]
[[Category:Device file]]
 
[[de:/dev/random]]
[[es:/dev/random]]
[[fr:/dev/random]]
[[it:/dev/random]]
[[ja:/dev/random]]
[[pl:/dev/random]]
[[pt:/dev/random]]
[[ru:/dev/random и /dev/urandom]]
[[tr:/dev/random]]
[[zh:/dev/random]]
 
==Voci correlate==
* <tt>[[:/dev/zero]]</tt>
* <tt>[[:/dev/full]]</tt>
* <tt>[[:/dev/null]]</tt>
 
{{Portale|Informatica}}
 
[[Categoria:Unix|Dev Random]]
 
[[de:/dev/random]]
[[en:/dev/random]]
[[es:/dev/random]]
[[fr:/dev/random]]
[[ja:/dev/random]]
[[pl:/dev/random]]
[[pt:/dev/random]]
[[ru:/dev/random и /dev/urandom]]
[[tr:/dev/random]]
[[zh:/dev/random]]