Java arasındaki fark.açıklama.Rastgele ve java.güvenlik.SecureRandom
Benim takım rastgele simgeleri oluşturan bazı sunucu tarafı kodu (Java) teslim aldım ve aynı ile ilgili bir soru var
Bu simgeleri amacı oldukça hassas - oturum kimliği için kullanılan, reset bağlantıları vs şifre. Şifreli olarak birisi onları tahmin önlemek için ya da kaba rastgele onların önemli güç olmak gerekiyor. Belirteç olduğu bir "uzun" yani 64 bit uzunluğundadır.
Kod şu an java.util.Random
sınıfı bu belirteçleri oluşturmak için kullanır. java.util.Random
açıkçası şu: devletler belgeleri (http://docs.oracle.com/javase/7/docs/api/java/util/Random.html)
Java örnekleri.açıklama.Rastgele şifreleme açısından güvenli değildir. Yerine SecureRandom şifreli olarak güvenli rasgele bir dizi güvenlik duyarlı uygulamalar tarafından kullanım için jeneratör almak için kullanmayı düşünün.
Ancak bu şekilde bu kodu kullanmakta java.util.Random
Bu başlatır java.security.SecureRandom
sınıf ve kullanır SecureRandom.nextLong()
yöntem elde etmek için tohum için kullanılan başlatmasını java.util.Random
sınıf. java.util.Random.nextLong()
yöntem belirteci oluşturmak için kullanır.
Yani şimdi benim sorum hala java.util.Random
java.security.SecureRandom
kullanarak seribaşı olmak olduğu göz önüne alındığında güvensiz mi? java.security.SecureRandom
) sadece belirteçleri oluşturmak için kullandığı kodu değiştirmek gerekiyor?
Saygılar
EDİT: Tekrar @Tom'un soru - şu Anda kod tohum bir kez başlangıçta Random
CEVAP
Standart Oracle java.util.Random
rastgele değerler üretmek için Doğrusal Congruential Jeneratör denilen 7 uygulaması ile İLGİLENİYORUZ.
Yöntemi hakkında bir yorum java.util.Random
kaynak kodu (ile İLGİLENİYORUZ 7u2), alınan rasgele değerler üretir hangisi protected int next(int bits)
,:
Bu doğrusal congruential rastgele sayı üreteci gibi. D. H. Lehmer tarafından tanımlanan ve Donald E. Knuth tarafından tanımlanan . ben^>Bilgisayar Programlama SanatıCilt 3: . ben^>Seminumerical Algoritmaları, bölüm 3.2.1.
Doğrusal Congruential Jeneratör öngörülebilirlik
Hugo Krawczyk bu LCGs tahmin edilebilir hakkında oldukça iyi bir kağıt yazdı (tahmin etmek için Nasıl"congruential jeneratör"). Eğer şanslı ve eğer ilgileniyorsanız, hala web üzerinde ücretsiz indirilebilir bir sürümünü bulabilirsiniz. Ve gerektiğini açıkça gösteren çok fazla araştırma varaslakritik güvenlik amaçlı bir A kullanın. Bu da rastgele sayılar anlamına gelirşimdi, oturum için istemediğin bir şey gibi Kimlikleri. tahmin edilebilir değil mi
Nasıl Doğrusal Congruential Jeneratör kırmak için
Saldırgan, A için tam bir döngüsü sonra tekrar beklemek zorunda kalacak varsayımı yanlış. Hatta optimal bir döngü (tekrarlama ilişkisi içinde modül m) çok kolay tam bir döngüsü daha az zamanda gelecekteki değerleri tahmin etmek çok zordur. Tüm bunlardan sonra, sadece kolay hale gelen çözülmesi gereken modüler denklemler, bir grup A yeterince çıkış değerleri gözlenen bulmaz.
İle artırmak değil güvenlik "daha iyi" tohum. Bu sadece rastgele bir değer ile tohum SecureRandom
tarafından oluşturulan hatta ölmeden birkaç kez haddeleme tarafından değer üretmek önemli değil.
Saldırganın sadece çıkış değerleri gözlenen gelen tohum bulunur. Bu alırönemli ölçüde daha azjava.util.Random
bu durumda 2^48 saat daha. Kafirler bu Random
gelecekteki çıkışları sadece iki gözlem tahmin edebilirsiniz gösterilen yere experiment, denemek olabilir(!) çıkış 2^16 kabaca zaman değerleri. Modern bir bilgisayar üzerinde bir saniye bile rasgele sayılar çıktı, şu anda tahmin etmek için alır.
Sonuç
Geçerli kodunuzu değiştirin. SecureRandom
kullanın. O zaman en azından sonucu tahmin etmek zor olacak küçük bir garanti olacaktır. Eğer şifreli olarak güvenli bir PRNG (senin durumunda, sizin istediğiniz de buydu) özelliklerini istiyorsanız, o zaman SecureRandom
ile sadece gitmek zorunda. Kullanılması gerektiği gibi değiştirme hakkında zeki olmak hemen hemen her zaman bir şey daha az güvenli neden olur...
'kamu, varsayılan olarak korumalı...
Yumuşak bir referans ve Java zayıf bir...
Kurallı, isim, basit isim ve Java Ders...
'getPath arasındaki fark ne(), ge...
Parseınt ve java değerini arasındaki f...