OWASP कैटगरी: MASVS-CRYPTO: क्रिप्टोग्राफ़ी
खास जानकारी
स्यूडोरैंडम नंबर जनरेटर (पीआरएनजी) एक ऐसा एल्गोरिदम है जो सीड नाम की शुरुआती वैल्यू के आधार पर, अनुमान लगाया जा सकने वाला नंबर सीक्वेंस. ऐप्लिकेशन पीआरएनजी जनरेट किए गए नंबर क्रम में करीब वही प्रॉपर्टी होती हैं जो वास्तव में किसी भी क्रम में संख्या का क्रम, लेकिन यह ज़्यादा तेज़ और कम कंप्यूटिंग की दृष्टि से महंगा होता है टैप करें.
दूसरे शब्दों में कहें, तो कमज़ोर आरएनजी की तुलना में, पीआरएनजी ज़्यादा भरोसेमंद होते हैं (उदाहरण के लिए,
java.math.Random
) एंट्रॉपी डिस्ट्रिब्यूशन की समता के हिसाब से देखें, जो
क्रम से लगाएं. वास्तविक में यादृच्छिक संख्या जनरेट करने की आवश्यकता है
जो आम तौर पर सामान्य डेवलपमेंट के दायरे से बाहर होते हैं. इस दस्तावेज़ में, रैंडम नंबर जनरेट करने के सटीक तरीके के बारे में नहीं बताया गया है. इसमें सिर्फ़ पीआरएनजी के बारे में बताया गया है, क्योंकि इनका इस्तेमाल स्टैंडर्ड तरीके के तौर पर किया जाता है.
कमज़ोर पीआरएनजी से जुड़ी सुरक्षा से जुड़ी समस्याएं तब होती हैं, जब डेवलपर क्रिप्टोग्राफ़िक तौर पर सुरक्षित पीआरएनजी (सीएसपीआरएनजी) के बजाय, क्रिप्टोग्राफ़िक कामों के लिए सामान्य पीआरएनजी का इस्तेमाल करते हैं. सीएसपीआरएनजी की शर्तें ज़्यादा सख्त होती हैं. अगर बीज की जानकारी नहीं है, तो उन्हें ये शर्तें पूरी करनी होंगी हैकर को किसी आउटपुट को अलग करने में सिर्फ़ मामूली फ़ायदा मिलता है किसी असल क्रम में लगाएं.
जब PRNG या CSPRNG को शुरू करने के लिए, ऐसे सीड का इस्तेमाल किया जाता है जिनका अनुमान लगाया जा सकता है, जैसे कि डेवलपर के हार्ड कोड किए गए सीड, तो हमलावर जनरेट किए गए नंबर के क्रम का अनुमान लगा सकते हैं. ऐसा इसलिए, क्योंकि हमलावर सीड का अनुमान लगा सकता है और इस तरह PRNG से जनरेट किए गए आउटपुट का अनुमान लगा सकता है.
असर
अगर पुष्टि करने जैसी सुरक्षा से जुड़े कॉन्टेक्स्ट में, क्रिप्टोग्राफ़िक तरीके से सुरक्षित नहीं किए गए पीआरएनजी का इस्तेमाल किया जाता है, तो हमलावर, रैंडम तरीके से जनरेट किए गए नंबरों का अनुमान लगा सकता है और खास डेटा या सुविधाओं का ऐक्सेस पा सकता है.
जोखिम कम करने के तरीके
सामान्य सेटिंग
- सुरक्षा से जुड़ी समस्याएं होने पर,
java.security.SecureRandom
का इस्तेमाल करें - दूसरे किसी भी मामले में
java.util.Random
का इस्तेमाल करें Math.random
का इस्तेमाल कभी न करें!
JavaScript
सुरक्षा से जुड़े कामों के लिए, इसका इस्तेमाल करने का सुझाव दिया जाता है. अगर Linux kernel का वर्शन 5.17 या उससे ज़्यादा है या थ्रेड को ब्लॉक करने की अनुमति है, तो रैंडम नंबर जनरेट करने (यानी /dev/random
का इस्तेमाल करने) से पहले, ज़रूरत के मुताबिक एन्ट्रोपी इकट्ठा होने का इंतज़ार करें. ऐसा करने के लिए, getInstanceStrong()
को कॉल करें:
Kotlin
val rand = SecureRandom.getInstanceStrong()
Java
SecureRandom rand = SecureRandom.getInstanceStrong();
इसके अलावा, रैंडम नंबर जनरेट करते समय, 5.17 से पहले के Linux kernel वर्शन पर, यदि थ्रेड को ब्लॉक करना स्वीकार नहीं किया जाता है, तो SecureRandom
कन्स्ट्रक्टर को सीधे तौर पर कॉल किया जाना चाहिए:
Kotlin
import java.security.SecureRandom
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = SecureRandom()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
// Use rand_int for security & authentication
}
}
Java
import java.security.SecureRandom;
public class generateRandom {
public static void main(String args[])
{
// Create instance of SecureRandom class
SecureRandom rand = new SecureRandom();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
// Use rand_int for security & authentication
}
}
SecureRandom
को /dev/urandom
से डिफ़ॉल्ट सीड मिलता है और यह अपने-आप
का उपयोग तब किया जाता है जब ऑब्जेक्ट का निर्माण किया जाता है या उसे प्राप्त कर लिया जाता है, इसलिए ऐसी कोई आवश्यकता नहीं है
अपने सुझाव के बारे में साफ़ तौर पर बताएं. आम तौर पर, SecureRandom
का इस्तेमाल करने का सुझाव नहीं दिया जाता. खास तौर पर, अगर इससे किसी सीड वैल्यू को हार्ड कोड किया जाता है, जिसे ऐप्लिकेशन को डिकंपाइल करने वाला कोई भी व्यक्ति देख सकता है. ऐसे डेवलपर जो जनरेट करना चाहते हैं
दोबारा बनाए जा सकने वाले स्यूडोरैंडम आउटपुट में, सबसे सही प्रिमिटिव का इस्तेमाल होना चाहिए, जैसे कि
HMAC, HKDF, और SHAKE.
java.util.रैंडम
सुरक्षा / पुष्टि करने के लिए, इस्तेमाल करने से बचें. हालांकि, इसे किसी भी अन्य काम के लिए इस्तेमाल किया जा सकता है.
Kotlin
import java.util.Random
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = Random()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
}
}
Java
import java.util.Random;
public class generateRandom {
public static void main(String args[])
{
// Create instance of Random class
Random rand = new Random();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
}
}
संसाधन
- java.security.Secure कार्रवाई
- java.util.Random
- Math.random
- सीड का अनुमान लगाने से जुड़ा CWE
- क्रिप्टोोग्राफ़िक रूप से कमज़ोर PRNG सीडब्ल्यूई
- Java सिक्योर रैंडम तरीके से
- जावा रैंडम बनाम सिक्योर रैंडम
- Secureरैंडम प्लान को इस्तेमाल करने का तरीका
- Python PRNG की सुरक्षा से जुड़े दिशा-निर्देश
- OWASP क्रिप्टोग्राफ़िक स्टोरेज के लिए चीट शीट
- CVE-2013-6386: Drupal में कमज़ोर पीआरएनजी कानून
- CVE-2006-3419: Tor में कमज़ोर पीआरएनजी वुलन
- CVE-2008-4102: Joomla में अनुमानित बीज
- Linux कर्नेल का रैंडम पैच