/dev/random

Unix türevi işletim sistemlerinde, **/dev/random** yalancı rastsal sayılar üreten bir stream dosyasıdır. Cihaz sürücülerinden ve diğer kaynaklardan toplanan çevresel gürültüye erişim sağlar. Bloklama ile çalışır. /dev/random normalde talep edildiğinden daha az entropi mevcutsa engeller, /dev/urandom tipik olarak asla engellemez, /dev/arandom yeterli entropi ile güvenli bir şekilde başlatılana kadar önyükleme sonrası bloklar ve daha sonra asla bloklanmaz. /dev/random ve /dev/urandom farklı işletim sistemlerinde farklı şekillerde uygulanmaktadır ve pek azı /dev/arandom desteğine sahiptir.

## Linux
Çekirdek alanından rastsal sayı üretimi, Linux için ilk kez 1994'te Theodore Ts'o tarafından gerçekleştirildi. Uygulama, tasarlandığında geçerli olan yasal kısıtlamalardan kaçınmak için şifreler yerine güvenli özet fonksiyonları kullanıldı. Uygulama ayrıca, verilen herhangi bir özet fonksiyonu veya şifrenin eninde sonunda zayıf olabileceği varsayımıyla tasarlandı ve bu nedenle tasarım, bu tür zayıflıkların karşısında dayanıklıdır. Havuz uzlaşmalarından hızlı bir şekilde kurtarmanın bir gereklilik olmadığı düşünülmektedir, çünkü havuz uzlaşma gereklilikleri, işletim sisteminin ilgisiz kısımlarına çok daha kolay ve doğrudan saldırılar için yeterlidir.

Ts'o'nun uygulamasında, oluşturucu entropi havuzundaki gürültü bitlerinin sayısını tahmin eder. Bu entropy havuzundan rastgele sayılar yaratılır. Okunduğunda, &nbsp;`/dev/random`, entropi havuzundaki tahmini gürültü bitleri sayısı içinde sadece rastgele baytları döndürür.Entropi havuzu boş olduğunda, ek çevresel gürültü toplanana kadar`/dev/random` okumaları bloke edilir. Amaç, entropi ile mümkün olduğu kadar büyük bir çıktı veren, kriptografik olarak güvenli bir sözde sayı üreteci olarak hizmet etmektir. Bu, yazarlar tarafından yüksek değerli veya uzun vadeli koruma için şifreleme anahtarlarının üretilmesinde kullanılması için önerilmektedir.

`dev/random` dışında  ("sınırsız"/ engel teşkil etmeyen rastgele kaynak) daha fazla sözde rastsal bit üretmek için dahili havuzu yeniden kullanır. Bu, çağrının engellenmeyeceği anlamına gelir, ancak çıktı, `/dev/random`'a karşılık gelen okumadan daha az entropi içerebilir. `/dev/urandom`, çoğu kriptografik amaç için uygun bir sahte rastsal sayı üreteci olarak tasarlanırken, ilgili sayfaların yazarları, teorik olarak, `/dev/urandom`tarafından kullanılan algoritma üzerinde henüz başlatılmamış bir saldırı olabileceğini belirtmektedir. Böyle bir saldırıdan endişe duyan kullanıcılar bunun yerine `/dev/random` kullanmalıdır. Ancak böyle bir saldırının ortaya çıkması olası değildir, çünkü entropi havuzu bir kez tahmin edilemediğinde, daha az sayıda bit ile güvenliği sızdırmaz.

`/dev/random`yazmak da mümkündür. Bu, herhangi bir kullanıcının rastgele verileri havuza karıştırmasına izin verir. Rastgele olmayan veriler zararsızdır, çünkü sadece ayrıcalıklı bir kullanıcı entropi tahminini artırmak için gerekli girdi/çıktı kontrolünü verebilir. Mevcut entropi miktarı ve Linux çekirdeği entropi havuzu boyutu, ikisinin de büyüklüğü bit olarak ölçülür, `/proc/sys/kernel/random/`'da mevcuttur ve `cat /proc/sys/kernel/random/entropy_avail` ve `cat /proc/sys/kernel/random/poolsize` komutlarının sıralı olarak kullanımı ile görüntülenebilir.

Gutterman, Pinkas, & Reinman, Mart 2006'da, bir dizi zayıflığı tanımladıkları Linux rastsal sayı üretecinin ayrıntılı bir kriptografik analizini yayınladılar. Yönlendirici ve disksiz istemciler gibi gömülü veya gerçek zamanlı işletim sistemlerinde rapor ettikleri en ciddi sorun, açılış durumunun öngörülebilir olduğu ve çevreden entropinin mevcut arzının sınırlı olabileceğidir. Kalıcı belleğe sahip bir sistemde, RNG(Rastsal Sayı Üretici) kapatılırken kapatma sırasındaki bazı durumlarını kaydetmesi önerilir, böylece bir sonraki yeniden başlatma sonrasındaki RNG'nin durumuna dahil edilebilir. Örnek olarak yönlendirici düşünülürse, entropi kaynağının ilk sırasında ağ trafiğinin olduğu durumda, mevcut durumun yeniden başlatmalarda korunmasının yönlendiricinin ilk işleme başladığı andan itibaren "potansiyel saldırganların tüm ağ trafiğini dinlemesi zorunluluğuna iter" veya yönlendiricinin ilk iç durumuna ulaşması zorunluluğuna iter. Bu sorun, ağ trafiğinin bir mesafeden yakalanabildiği kablosuz yönlendirici ve veri şifreleme için kullanılan anahtarların üretilmesi için RNG'nin kullanıldığı durumlarda özellikle kritiktir.

Linux çekirdeği birçok donanım tabanlı rastsal sayı üreticiler için destek sunmaktadır. Böyle bir cihazın ürettiği işlenmemiş çıktı şu komutla elde edilebilir: `/dev/hwrng`.

3.16 versiyonu veya daha yeni Linux çekirdek versiyonlarında, çekirdek kendisi, donanım tabanlı rastsal sayıları ayarlanabilir entropi kalitesinde `/dev/random`'a karıştırır. Bu demektir ki kullanıcı alanında arka planda çalışan program, `rng-tools`'tan `rngd` gibi, bu işi yapmak için gerekli değildir. 3.17'den sonraki Linux çekirdek versiyonları ile birlikte, VirtIO RNG varsayılan olarak 0'dan daha kalite olacak şekilde değiştirilmiştir, ve bu şu anda sadece HWRNG(Hardware Random Number Generator-Donanım Tabanlı Rastsal Sayı Üretici)'nin `/dev/random` varsayılan olarak karıştıldığı örnektir.

entropi havuzu `timer_entropyd`, `haveged`, `randomsound` vb. programlar ile geliştirilebilir. `rng-tools` ile birlikte entropi anahtarı gibi donanım rastgele sayı üreteçleri `/dev/random`'a yazabilir. `dieharder`, `diehard` ve `ent` oprogramları bu rastgele sayı üreteçlerini test edebilir.

Ocak 2014'te, Daniel J. Bernstein, Linux'un birbirinden farklı entropi kaynaklarını nasıl karıştırdığına dair bir eleştiri yayınladı. Daniel J. Bernstein bir saldırıya işaret etti, bu saldırı, bir entropinin başka bir entropini görüntülemesi, bu entropinin çıktısını etkileyerek diğer entropi kaynaklarının rastsallığını sıfırlar. Örneğin H(x, y, z) fonksiyonu olduğunu varsayılsın, H fonksiyonu bir özet fonksiyonu, x, y, z ise birer entropi kaynağı, z işlemci kaynaklı kötücül bir HRNG Z:

# *Z* r rastsal r değeri oluşturur
# *Z* *H(x,y,r) fonksiyonunu hesaplar*.
# Eğer çıktı H(x, y, r) istenilen değere eşit ise, çıktı r'ı z'ye ata.
# Öbür türlü aşama 1'den tekrar başla.

Bernstein, DSA ve ECDSA'yı tehlikeye atmak için saldırganın 16 defa H(x, y, r) tekrarlaması yeterli olacaktır. Bu Linux'un tek bir sefer kaliteli bir şekilde beslemesi yerine H fonksiyonunu tekrar tekrar beslemesi yüzünden olmaktadır.

Kasım 2016'da Linux çekirdeğinin 4.8 versiyonu veya daha yenisi yayınlandı, bu versiyonda Theodore Ts'o tarafından `/dev/urandom` ChaCha20 tabanlı uygulama ile değiştirildi, bu Bernstein'ın iyi anılan akan şifreleme yöntemi ChaCha20 tabanlı tasarlanmıştır.

## FreeBSD
FreeBSD işletim sistemi `/dev/urandom` uyumluluğu sağlamakta ama işleyişi Linux'takinden çok farklıdır. FreeBSD'de, bloklar düzgün beslenene kadar `/dev/urandom` `/dev/random`'a bağlı tutulur. FreeBSD'nin PRNG'si(Fortuna) düzenli olarak besler ama entropiyi hesaplama konusunda girişimde bulunmaz. Düşük seviyede ağ trafiği ve disk kullanımı olduğunda, geri besleme küçük bir zaman ile gerçekleşir.

entropi havuzu temelli metotlar, doğru bir şekilde uygulandığında tamamen güvenli olurken, entropiyi fazla tahmin ederse, iyi beslenmiş PRNG'lerden daha az güvenli olabilirler. Bazı durumlarda, bir saldırganın entropi üzerinde önemli miktarda kontrolü olabilir; Örneğin, disksiz bir sunucu, neredeyse tüm ağdan alabilir ve potansiyel olarak ortadaki adam saldırılarına karşı savunmasız hale getirebilir.

## OpenBSD
OpenBSD 5.1 (1 Mayıs 2012)  ve  RC4 tabanlı bir algoritma kullandığından, fikrî mülkiyet nedenleriyle ARC4 nedeniyle yeniden adlandırılmıştır. Rastgele sayı üretimi burada çeşitli yollarla toplanan sistem entropiyi kullanırken, ARC4 algoritması, havuzun düşük entropi durumunda olduğu durumlarda bile hızlı ve yüksek kalitede sözde rastsal sayı akışının sağlanmasını garantileyen bir arıza güvenliği sağlar. Sistem, eğer mevcutsa OpenBSD Şifreleme Çerçevesi aracılığıyla donanım rastgele sayı üreteçlerini (bazı Intel PCI hub'larında sağlananlar gibi) otomatik olarak kullanır.

OpenBSD 5.5 (1 Mayıs 2014) itibarıyla, OpenBSD'nin rastgele aygıtları için kullanılan arc4random () çağrısı artık ARC4 kullanmamaktadır, ancak ChaCha20 (arc4random adı Rastgele Değişim Çağrısı(A Replacement Call for Random) olarak yeniden değerlendirilebilir) olabilir. NetBSD'nin eski arc4random () API'sinin uygulanması da ChaCha20'ye de geçmiştir.

## macOS and iOS
macOS ise 160-bit SHA1 tabanlı Yarrow kullanır. /dev/random ile /dev/urandom arasında herhangi bir fark yoktur, ikisi de aynı şekilde davranır. Apple'ın iOS işletim sistemi de Yarrow kullanır.

## Diğer işletim sistemleri
`/dev/random` ve`/dev/urandom`'daare also available on Solaris, NetBSD, Tru64 UNIX 5.1B, AIX 5.2 ve HP-UX 11i v2'de kullanılabilir. FreeBSD'de olduğu gibi, AIX kendi Yarrow tabanlı tasarımını uygular, ancak AIX standart `/dev/random` uygulamadan çok daha az entropi kaynağı kullanır ve yeterli entropi içerdiğini düşündüğünde havuzu yeniden beslemeyi durdurur.

In Windows NT'de, benzer işlevsellik `ksecdd.sys`, tarafından sağlanır, ancak özel dosya okuması `\Device\KsecDD`, UNIX'te olduğu gibi çalışmaz. Kriptografik olarak rastgele baytlar üretmek için belgelenmiş yöntemler CryptGenRandom ve RtlGenRandom'dur.

DOS doğal olarak böyle bir işlevsellik sunmazken, `noise.sys` adlı bir açık kaynaklı, üçüncü kişiler tarafından sağlanan sürücü, benzer şekilde çalışan iki cihaz yaratır, `RANDOM$` ve `URANDOM$`, `/DEV/RANDOM$` ve`/DEV/URANDOM$`'dan erişilebilir olarak sunar. Program buradan rastsal veriye ulaşabilir.

Windows üzerindeki Linux emülatörü Cygwin, komut dosyalarında ve programlarda kullanılabilen hem `/dev/random` hem de `/dev/urandom`uygulamalarını sağlar.

## Ayrıca bakınız

* Donanım rastgele sayı üreteci

## Kaynakça