SecureRandom iş parçacığı güvenli midir?


103

İş SecureRandomparçacığı güvenli mi? Yani, onu başlattıktan sonra, sıradaki rastgele sayıya erişimin iş parçacığı açısından güvenli olduğuna güvenilebilir mi? Kaynak kodun incelenmesi, öyle olduğunu gösteriyor gibi görünüyor ve bu hata raporu , iş parçacığı güvenli olarak dokümantasyon eksikliğinin bir javadoc sorunu olduğunu gösteriyor gibi görünüyor. Aslında iş parçacığı güvenli olduğunu doğrulayan var mı?

Yanıtlar:


108

Evet öyle. Her Randomzaman fiili bir iş parçacığı güvenli uygulaması olan genişler ve Java 7'den açıkça iş parçacığı güvenliğini garanti eder.

Birçok iş parçacığı tek bir iş parçacığı kullanıyorsa SecureRandom, performansı düşüren çekişme olabilir. Öte yandan, bir SecureRandomörneği başlatmak nispeten yavaş olabilir. Global bir RNG'yi paylaşmanın veya her iş parçacığı için yeni bir tane oluşturmanın en iyisi olup olmadığı, uygulamanıza bağlı olacaktır. ThreadLocalRandomSınıf desteklerin bir çözüm sağlamak için bir model olarak kullanılabilir SecureRandom.


3
Güncelleme için teşekkürler. İşin garibi, hata "düzeltilmeyecek" olarak kapalı olarak işaretlenmiştir. Ama yine de düzelttiler. Oh pekala, onları hata veri tabanlarının boyutunu kıskanmıyorum.
Yishai

4
başlatılıyor bir SecureRandomsadece can yavaş, ancak potansiyel nedeniyle eksik entropi asmak
Walter Tross

8
Lütfen ThreadLocalRandom'un kırılmasının çok kolay olduğunu unutmayın, bu nedenle üretilen değeri dünyaya göstermeyi planlıyorsanız, bunun yerine SecureRandom
walv

2
Burada bir uzvun dışına çıkıp bu cevabın yanlış olduğunu söyleyeceğim. İplik güvenliğini garanti eden Random sözleşmesi alt sınıflar için bağlayıcı değildir. Elbette, Random'ın diğer tüm özellikleri alt sınıflar için bağlayıcı değildir, bu yüzden iş parçacığı güvenliğinin neden varsayılması gerektiğini anlamıyorum.
Başkan James K. Polk

2
@JamesKPolk Süper tipin bir özelliğini korumadaki başarısızlık, ikame edilebilirlik ilkesini ihlal eder.
erickson

11

Şu anki uygulaması SecureRandomiş parçacığı açısından güvenlidir, özellikle iki mutasyon yöntemi nextBytes(bytes[])ve setSeed(byte[])senkronize edilmiştir.

Anlayabildiğim kadarıyla, tüm mutasyon yöntemleri sonunda bu iki yöntem üzerinden yönlendirilir ve bunu sağlamak SecureRandomiçin birkaç yöntemi geçersiz kılar Random. İşe yarayan ancak gelecekte uygulama değiştirilirse kırılgan olabilir.

En iyi çözüm, önce SecureRandomörnek üzerinde manuel olarak senkronize etmektir . Bu, her çağrı yığınının aynı nesne üzerinde iki kilit alacağı anlamına gelir, ancak bu genellikle modern JVM'lerde çok ucuzdur. Yani, kendinizi açıkça senkronize etmenin pek bir zararı yoktur. Örneğin:

    SecureRandom rnd = ...;

    byte[] b = new byte[NRANDOM_BYTES];
    synchronized (rnd) {
        rnd.nextBytes(b);
    }

3
En azından JDK 10'da, SecureRandom bir sağlayıcıya dayanır ve sağlayıcının iş parçacığı açısından güvenli olup olmadığını kontrol eder, yalnızca nextBytes'te değilse senkronize eder.
nafg

java.security.SecureRandom#nextBytesJava 8'de senkronize edilmemiştir. Senkronize edilmiş bir Java sürümü bulduğunuzu belirtebilir misiniz #nextBytes?
Jaime Hablutzel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.