जावा एप्लिकेशन क्रिप्टोग्राफिक रूप से मजबूत छद्म यादृच्छिक संख्या जनरेटर ( CSPRNG ) का उपयोग करके क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिक मूल्यों का उत्पादन करने के लिए java.security.SecureRandom वर्ग का उपयोग कर सकते हैं और करना चाहिए । Java.util.Random क्लास के मानक JDK कार्यान्वयन को क्रिप्टोग्राफिक रूप से मजबूत नहीं माना जाता है।
यूनिक्स की तरह के ऑपरेटिंग सिस्टम में /dev/randomएक विशेष फाइल होती है जो डिवाइस ड्राइवर्स और अन्य स्रोतों से एकत्र किए गए पर्यावरणीय शोर तक पहुँचने वाले छद्म यादृच्छिक संख्याओं को परोसती है। हालाँकि, यह ब्लॉक करता है यदि अनुरोध की तुलना में कम एन्ट्रॉपी उपलब्ध है ; /dev/urandomआमतौर पर कभी ब्लॉक नहीं होता है, भले ही छद्म आयामी जनरेटर जनरेटर बीज बूट के बाद एन्ट्रापी के साथ पूरी तरह से प्रारंभिक नहीं था। अभी भी एक 3 विशेष फ़ाइल है, /dev/arandomजो बूट के बाद ब्लॉक करता है जब तक कि बीज को पर्याप्त एन्ट्रॉपी के साथ सुरक्षित रूप से आरंभीकृत नहीं किया गया है, और फिर कभी भी ब्लॉक नहीं करता है।
डिफ़ॉल्ट रूप से, JVM सिक्योर रैंडम क्लास का उपयोग करके बीज देता है /dev/random, इसलिए आपका जावा कोड अप्रत्याशित रूप से ब्लॉक हो सकता है । -Djava.security.egd=file:/dev/./urandomजावा प्रक्रिया शुरू करने के लिए उपयोग की जाने वाली कमांड लाइन इनवोकेशन का विकल्प जेवीएम को /dev/urandomइसके बजाय उपयोग करने के लिए कहता है ।
अतिरिक्त SHA1PRNG एल्गोरिथ्म/./ का उपयोग करने के लिए JVM बनाने के लिए लगता है जो PRAG (छद्म रैंडम नंबर जेनरेटर) की नींव के रूप में SHA-1 का उपयोग करता है। यह /dev/urandomनिर्दिष्ट किए जाने पर उपयोग किए गए NativePRNG एल्गोरिथम से अधिक मजबूत है ।
अंत में, एक मिथक है /dev/urandomजो एक छद्म यादृच्छिक संख्या जनरेटर है, एक PRNG है, जबकि /dev/randomएक "सच" यादृच्छिक संख्या जनरेटर है । यह केवल सच नहीं है, दोनों /dev/randomऔर /dev/urandomएक ही CSPRNG (क्रिप्टोग्राफी द्वारा सुरक्षित कूट-यादृच्छिक संख्या जनरेटर) द्वारा खिलाया जाता है। केवल व्यवहार जब उनके संबंधित पूल एंट्रोपी से बाहर निकलते हैं, तो कुछ अनुमान के अनुसार, भिन्न होता है: /dev/randomब्लॉक, जबकि /dev/urandomनहीं।
एन्ट्रापी कम चलने के बारे में क्या? इससे कोई फर्क नहीं पड़ता।
यह पता चला है कि "बेतरतीब दिखना" हमारे क्रिप्टोग्राफिक बिल्डिंग ब्लॉकों के बहुत सारे के लिए बुनियादी आवश्यकता है। और यदि आप एक क्रिप्टोग्राफिक हैश का उत्पादन लेते हैं, तो इसे यादृच्छिक स्ट्रिंग से अप्रभेद्य होना चाहिए ताकि सिफर इसे स्वीकार करेंगे। यह SHA1PRNG एल्गोरिथ्म का उपयोग करने का कारण है, क्योंकि यह एक बीज के साथ हैश फ़ंक्शन और एक काउंटर का उपयोग करता है।
कब लागू किया जाना है?
हमेशा, मैं कहूंगा।
स्रोत:
https://gist.github.com/svrc/5a8accc57219b9548fe1
https://www.2uo.de/myths-about-urandom
EDIT 04/2020:
एक टिप्पणी में जावा 8 में सिक्योर रैंडम क्लास के व्यवहार पर बदलाव का उल्लेख किया गया है ।
SHA1PRNG और NativePRNG को java.srurity फ़ाइल में SecureRandom बीज स्रोत गुणों का ठीक से सम्मान करने के लिए निर्धारित किया गया था। (फ़ाइल का उपयोग करते हुए अस्पष्ट वर्कअराउंड: /// dev / urandom और फ़ाइल: / dev /./ यूरेनियम की अब आवश्यकता नहीं है।)
यह पहले से ही ऊपर दिए गए स्रोत अनुभाग में संदर्भित परीक्षणों द्वारा इंगित किया गया था। अतिरिक्त 8 में SecureRanom/./ द्वारा उपयोग किए गए एल्गोरिदम को NativePRNG से SHA1PRNG में बदलने की आवश्यकता है ।
हालाँकि, मेरे पास कुछ ऐसी खबरें हैं जिन्हें मैं साझा करना चाहता हूं। के रूप में प्रति JEP-273 , जावा 9 के बाद से SecureRandom वर्ग औजार तीन नियतात्मक यादृच्छिक बिट जनरेटर (DRBG) तंत्र में वर्णित NIST 800-90Ar1 । ये मैकेनिज्म आधुनिक एल्गोरिदम को SHA-512 और AES-256 जितना मजबूत बनाता है।
JDK में दो प्रकार के सिक्योर रैंडम कार्यान्वयन थे:
- एक प्लेटफ़ॉर्म-निर्भर है और देशी कॉल या ओएस उपकरणों पर आधारित है जैसे कि
/dev/{u}randomयूनिक्स पर पढ़ना या विंडोज पर क्रिप्टोकरेंसी का उपयोग करना। लिनक्स और विंडोज के नवीनतम रिलीज पहले से ही डीआरबीजी का समर्थन करते हैं, लेकिन पुराने रिलीज और एम्बेडेड सिस्टम नहीं हो सकते हैं ।
- दूसरी तरह का शुद्ध जावा कार्यान्वयन है जो पुराने SHA1- आधारित RNG कार्यान्वयन का उपयोग करता है, जो कि स्वीकृत DRBG तंत्र द्वारा उपयोग किए गए एल्गोरिदम जितना मजबूत नहीं है।
इस बीच जावा 13 सुरक्षा डेवलपर की गाइड अभी भी पढ़ती है
Linux और macOS पर, यदि java.security में एन्ट्रापी सभा उपकरण file:/dev/urandomया पर सेट है file:/dev/random, तो NativePRNG SHA1PRNG को पसंद किया जाता है। अन्यथा, SHA1PRNG को प्राथमिकता दी जाती है।
यह स्पष्ट करने के लिए कि नए DRBG तंत्र पिछले PRNGs के साथ कैसे खेलते हैं, मैं AdoptOpenJDK (13.0.2 + 8 का निर्माण) के साथ macOS (डार्विन) पर कुछ परीक्षण चलाता हूं। यहाँ परिणाम हैं:
फ़ाइल: / dev / यादृच्छिक
प्रदाताओं के लिए वरीयता क्रम:
SecureRandom.NativePRNG
SecureRandom.DRBG
SecureRandom.SHA1PRNG
फ़ाइल: / dev / urandom
प्रदाताओं के लिए वरीयता का क्रम:
SecureRandom.NativePRNG
SecureRandom.DRBG
SecureRandom.SHA1PRNG
फ़ाइल: / dev /./ यूरेनियम का
प्रदाताओं के लिए वरीयता क्रम:
SecureRandom.DRBG
SecureRandom.SHA1PRNG
SecureRandom.NativePRNG
निष्कर्ष:
मैं -Djava.security.egd=file:/dev/./urandomयह सुनिश्चित करने के लिए उपयोग करूंगा कि प्लेटफ़ॉर्म का अप्रत्याशित रूप से अवरुद्ध होने से बचने के लिए उपयोग किए गए प्लेटफ़ॉर्म का उपयोग किए बिना सबसे सुरक्षित सिक्योर रैंडम कार्यान्वयन का लाभ उठाएं ।