Random vs SecureRandom

Nesrin Asan
2 min readApr 1, 2022

--

Photo by davisuko on Unsplash

Random veriye ihtiyacımız olduğu zaman en çok kullandığımız java kütüphanesidir Random kütüphanesi.

Özellikle Fortify, SonarQube gibi static kod analizi yapan tool’ları kullanmaya başladığımızdan beri bu konuda farkındalık oluşmaya başladı. Bu tool’lar bize secure random üretebilen bir kütüphane olan SecureRandom kütüphanesini kullanmayı öneriyor.

PEKİ BU KÜTÜPHANELER ARASINDAKİ FARK NEDİR

Buradaki fark aslında random olarak oluşturulan değelerin tahmin edilebilirliği üzerine.

RANDOM()

Random random = new Random(); veya Math.random() ile oluşturulan değerler Linear Congruential Generator (LCG) algoritması ile random değerler üretir. Bu algoritmanın random sayı üretme şeklini kabaca söylemek gerekirse başlangıçta sabit bir değer alıyor. Bu değerin adı seed olarak tanımlanıyor. Kendiniz bu algoritmayı kullanmak isterseniz bu seed değerini uygulamanın açılış tarihi, system millisecond gibi değerleri alabilirsiniz. Aşağıki görüntüde ise Random classı için java tarafından verilen sabit başlangıç değeri görülmekte.

Random kütüphanesi Sistem saatini kullanarak bu seed değerini üretir. Bu da sistemin saatini bilen birinin daha kolay saldırmasına sebebiyet verebilir.

Random classı seed üretimi

numberi+1 = (a * numberi + c) mod m

LCG algoritmasının formülü burada veriliyor. Çoğu random üreteçleri bu formülün farklı türevlerini kullanabilir. Ve bu da tahmin edilebilirliği arttırır. Çünkü random sayıların oluşması istatistikseldir.

Random kütüphanesi determenistik çıktı verir. Yani ard arda üretilen sayıların durumunda bir rastgelelik yoktur diyebiliriz.

SECURE RANDOM()

SecureRandom kütüphanesi ise non-determenistict çıktı verir. Ve kriptografik olarak daha güçlüdür. Bu kütüphane arka planda SHA1PRNG algoritmasını kullanır.

Her bir sayı arttırımı için ayrıca 64 bitlik bir sequence değeri ile birleştirme yapılır.

Seed değeri secure random için de geçerlidir. Ancak bu değer sistem saati gibi bir değer değil, işletim sisteminde tutulan rastgele bir değerdir.

Tabiki karmaşık bir algoritma kullanması sebebi ile Random’a göre daha yavaş çalışacaktır.

Özellikle kritik noktalar için Random değerler kullanmamız gerektiğinde SecureRandom yapısını kullanmalıyız.

Son olarakta LCG ve CSPRNG arasındaki üretim farkını gösteren güzel bir görselle konuyu kapatmış olayım. İlk görsel LCG algoritmasının veri üretiminin determenistik olduğunu gösterirken ikinci görsel CSPRNG(cryptographically strong pseudo-random number generator) ile üretimin nasıl olduğu hakkında bilgi veriyor.

https://www.baeldung.com/java-secure-random

Kaynak:

https://www.baeldung.com/java-secure-random

https://www.geeksforgeeks.org/random-vs-secure-random-numbers-java/

Bug’sız günler :)

--

--