कलन विधि
एक यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए, संक्षिप्त वर्णों को स्वीकार्य प्रतीकों के सेट से यादृच्छिक रूप से खींचा जाता है जब तक कि स्ट्रिंग वांछित लंबाई तक नहीं पहुंच जाती।
कार्यान्वयन
यादृच्छिक पहचानकर्ता उत्पन्न करने के लिए यहां कुछ सरल और बहुत ही लचीला कोड है। महत्वपूर्ण एप्लिकेशन नोटों के लिए निम्नलिखित जानकारी पढ़ें ।
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);
}
}
उपयोग के उदाहरण
8-वर्ण पहचानकर्ताओं के लिए एक असुरक्षित जनरेटर बनाएँ:
RandomString gen = new RandomString(8, ThreadLocalRandom.current());
सत्र पहचानकर्ताओं के लिए एक सुरक्षित जनरेटर बनाएँ:
RandomString session = new RandomString();
मुद्रण के लिए आसान-से-पढ़ने वाले कोड के साथ एक जनरेटर बनाएं। कम प्रतीकों का उपयोग करने के लिए क्षतिपूर्ति के लिए तार पूर्ण अल्फ़ान्यूमेरिक स्ट्रिंग्स की तुलना में अधिक हैं:
String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx";
RandomString tickets = new RandomString(23, new SecureRandom(), easy);
सत्र पहचानकर्ता के रूप में उपयोग करें
सत्र पहचानकर्ता जो अद्वितीय होने की संभावना रखते हैं, पर्याप्त अच्छा नहीं है, या आप बस एक साधारण काउंटर का उपयोग कर सकते हैं। जब अटकलबाजों का उपयोग किया जाता है तो हमलावर सत्र को रोक देते हैं।
लंबाई और सुरक्षा के बीच तनाव है। कम पहचानकर्ताओं को अनुमान लगाना आसान है, क्योंकि कम संभावनाएं हैं। लेकिन अब पहचानकर्ता अधिक भंडारण और बैंडविड्थ का उपभोग करते हैं। प्रतीकों का एक बड़ा सेट मदद करता है, लेकिन पहचानने में समस्या हो सकती है यदि पहचानकर्ताओं को यूआरएल में शामिल किया जाता है या हाथ से फिर से दर्ज किया जाता है।
सत्र पहचानकर्ताओं के लिए यादृच्छिकता, या एन्ट्रापी का अंतर्निहित स्रोत क्रिप्टोग्राफी के लिए डिज़ाइन किए गए यादृच्छिक संख्या जनरेटर से आना चाहिए। हालांकि, इन जनरेटर को शुरू करना कभी-कभी कम्प्यूटेशनल रूप से महंगा या धीमा हो सकता है, इसलिए जब संभव हो तो उन्हें फिर से उपयोग करने का प्रयास किया जाना चाहिए।
ऑब्जेक्ट पहचानकर्ता के रूप में उपयोग करें
हर एप्लिकेशन को सुरक्षा की आवश्यकता नहीं होती है। किसी भी समन्वय या विभाजन के बिना साझा स्थान में पहचानकर्ता उत्पन्न करने के लिए कई संस्थाओं के लिए रैंडम असाइनमेंट एक कुशल तरीका हो सकता है। समन्वय धीमा हो सकता है, विशेष रूप से एक संकुल या वितरित वातावरण में, और एक स्थान को विभाजित करने से समस्याएं पैदा होती हैं जब संस्थाएं उन शेयरों के साथ समाप्त हो जाती हैं जो बहुत छोटे या बहुत बड़े होते हैं।
बिना पहचान के उपाय करने के कारण उत्पन्न पहचानकर्ताओं को अन्य माध्यमों से संरक्षित किया जाना चाहिए, यदि कोई हमलावर उन्हें देखने और उनमें हेरफेर करने में सक्षम हो सकता है, जैसा कि अधिकांश वेब अनुप्रयोगों में होता है। एक अलग प्राधिकरण प्रणाली होनी चाहिए जो उन वस्तुओं की सुरक्षा करती है जिनकी पहचानकर्ता को बिना अनुमति के किसी हमलावर द्वारा अनुमान लगाया जा सकता है।
पहचानकर्ताओं का उपयोग करने के लिए भी ध्यान रखा जाना चाहिए, जो कि लंबे समय तक टकराव करने के लिए पर्याप्त हैं, जो कि पहचानकर्ताओं की अनुमानित कुल संख्या को देखते हुए संभव नहीं है। इसे "जन्मदिन विरोधाभास" कहा जाता है। टकराव, पी की संभावना लगभग n 2 / (2q x ) है, जहां n वास्तव में उत्पन्न पहचानकर्ताओं की संख्या है, q वर्णमाला में अलग-अलग प्रतीकों की संख्या है, और x पहचानकर्ताओं की लंबाई है। यह बहुत छोटी संख्या होनी चाहिए, जैसे 2 a50 या उससे कम।
इस पर काम करने से पता चलता है कि 500k 15-वर्ण पहचानकर्ताओं के बीच टकराव की संभावना लगभग 2 , 52 है , जो कि ब्रह्मांडीय किरणों से अनिर्धारित त्रुटियों की संभावना कम है, आदि।
यूयूआईडी के साथ तुलना
उनके विनिर्देश के अनुसार, यूयूआईडी को अप्रत्याशित नहीं बनाया गया है, और इसका उपयोग सत्र पहचानकर्ताओं के रूप में नहीं किया जाना चाहिए ।
UUIDs अपने मानक प्रारूप में बहुत अधिक स्थान लेते हैं: केवल 122 बिट्स एन्ट्रापी के लिए 36 वर्ण। ("यादृच्छिक" UUID के सभी बिट्स को यादृच्छिक रूप से नहीं चुना जाता है।) एक बेतरतीब ढंग से चुने गए अल्फ़ान्यूमेरिक स्ट्रिंग पैक केवल 21 वर्णों में अधिक एन्ट्रॉपी हैं।
यूयूआईडी लचीले नहीं हैं; उनके पास एक मानकीकृत संरचना और लेआउट है। यह उनका मुख्य गुण होने के साथ-साथ उनकी मुख्य कमजोरी भी है। बाहरी पार्टी के साथ सहयोग करते समय, यूयूआईडी द्वारा प्रस्तुत मानकीकरण सहायक हो सकता है। विशुद्ध रूप से आंतरिक उपयोग के लिए, वे अक्षम हो सकते हैं।