Algoritma
Rastgele bir dize oluşturmak için, kabul edilebilir simgeler kümesinden rastgele çizilen karakterleri, dize istenen uzunluğa ulaşıncaya kadar birleştirin.
uygulama
Rastgele tanımlayıcılar oluşturmak için oldukça basit ve çok esnek bir kod. Önemli uygulama notları için aşağıdaki bilgileri okuyun .
public class RandomString {
/**
* Generate a random string.
*/
public String nextString() {
for (int idx = 0; idx < buf.length; ++idx)
buf[idx] = symbols[random.nextInt(symbols.length)];
return new String(buf);
}
public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String lower = upper.toLowerCase(Locale.ROOT);
public static final String digits = "0123456789";
public static final String alphanum = upper + lower + digits;
private final Random random;
private final char[] symbols;
private final char[] buf;
public RandomString(int length, Random random, String symbols) {
if (length < 1) throw new IllegalArgumentException();
if (symbols.length() < 2) throw new IllegalArgumentException();
this.random = Objects.requireNonNull(random);
this.symbols = symbols.toCharArray();
this.buf = new char[length];
}
/**
* Create an alphanumeric string generator.
*/
public RandomString(int length, Random random) {
this(length, random, alphanum);
}
/**
* Create an alphanumeric strings from a secure generator.
*/
public RandomString(int length) {
this(length, new SecureRandom());
}
/**
* Create session identifiers.
*/
public RandomString() {
this(21);
}
}
Kullanım örnekleri
8 karakterli tanımlayıcılar için güvenli olmayan bir jeneratör oluşturun:
RandomString gen = new RandomString(8, ThreadLocalRandom.current());
Oturum tanımlayıcıları için güvenli bir jeneratör oluşturun:
RandomString session = new RandomString();
Yazdırma için okunması kolay kodlara sahip bir jeneratör oluşturun. Daha az sembol kullanmayı telafi etmek için dizeler tam alfasayısal dizelerden daha uzundur:
String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx";
RandomString tickets = new RandomString(23, new SecureRandom(), easy);
Oturum tanımlayıcıları olarak kullan
Benzersiz olması muhtemel oturum tanımlayıcıları oluşturmak yeterince iyi değildir, ya da basit bir sayaç kullanabilirsiniz. Saldırganlar öngörülebilir tanımlayıcılar kullanıldığında oturumları ele geçirir.
Uzunluk ve güvenlik arasında gerginlik var. Daha kısa tanımlayıcıların tahmin edilmesi daha kolaydır, çünkü daha az olasılık vardır. Ancak daha uzun tanımlayıcılar daha fazla depolama alanı ve bant genişliği tüketir. Daha büyük bir simge seti yardımcı olur, ancak URL'lere tanımlayıcılar dahil edilirse veya elle yeniden girilirse kodlama sorunlarına neden olabilir.
Oturum tanımlayıcıları için temeldeki rasgelelik veya entropi kaynağı, kriptografi için tasarlanmış rastgele bir sayı üreticisinden gelmelidir. Bununla birlikte, bu jeneratörlerin başlatılması bazen hesaplama açısından pahalı veya yavaş olabilir, bu nedenle mümkünse bunları yeniden kullanmak için çaba gösterilmelidir.
Nesne tanımlayıcıları olarak kullan
Her uygulama güvenlik gerektirmez. Rastgele atama, birden çok kuruluş için herhangi bir koordinasyon veya bölümleme olmaksızın paylaşılan bir alanda tanımlayıcılar oluşturmak için etkili bir yol olabilir. Koordinasyon, özellikle kümelenmiş veya dağıtılmış bir ortamda yavaş olabilir ve bir alanın bölünmesi, kuruluşların çok küçük veya çok büyük paylaşımlarla sonuçlanması durumunda sorunlara neden olur.
Bir saldırgan, çoğu web uygulamasında olduğu gibi bunları görüntüleyip değiştirebiliyorsa, bunları öngörülemez hale getirmek için önlem almadan oluşturulan tanımlayıcılar başka yollarla korunmalıdır. Tanımlayıcısı bir saldırgan tarafından erişim izni olmadan tahmin edilebilecek nesneleri koruyan ayrı bir yetkilendirme sistemi olmalıdır.
Öngörülen toplam tanımlayıcı sayısı göz önüne alındığında, çarpışma olasılığını ortadan kaldıracak kadar uzun tanımlayıcıların kullanılmasına da dikkat edilmelidir. Buna "doğum günü paradoksu" denir. Bir çarpışma olasılığı, p , yaklaşık olarak n 2 / (2q x ) 'dir, burada n , gerçekte oluşturulan tanımlayıcıların sayısıdır, q , alfabedeki farklı sembollerin sayısıdır ve x , tanımlayıcıların uzunluğudur. Bu, 2 ‑50 veya daha az gibi çok küçük bir sayı olmalıdır .
Bunu çözmek, 500k 15 karakterlik tanımlayıcılar arasında çarpışma olasılığının yaklaşık 2 ‑52 olduğunu gösterir , bu muhtemelen kozmik ışınlardan vb. Tespit edilmeyen hatalardan daha az olasıdır.
UUID'lerle Karşılaştırma
Onların Patent açıklamasına göre, Uuıdlerin öngörülemeyen olacak şekilde tasarlanmıştır değildir ve olmamalıdır oturum tanımlayıcıları olarak kullanılabilir.
Standart formatlarındaki UUID'ler çok yer kaplar: Sadece 122 bit entropi için 36 karakter. ("Rastgele" bir UUID'nin tüm bitleri rastgele seçilmez.) Rastgele seçilen bir alfasayısal dize, yalnızca 21 karakterde daha fazla entropi oluşturur.
UUID'ler esnek değildir; standart bir yapıya ve düzene sahiptirler. Bu onların başlıca erdemleri ve ana zayıflıklarıdır. Bir dış tarafla işbirliği yaparken, UUID'ler tarafından sunulan standartlaştırma yardımcı olabilir. Tamamen dahili kullanım için verimsiz olabilirler.