धीमे सिक्योर रैंडम जनरेटर से कैसे निपटें?


165

यदि आप जावा में एक क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिक संख्या चाहते हैं, तो आप उपयोग करते हैं SecureRandom। दुर्भाग्य से, SecureRandomबहुत धीमी गति से हो सकता है। यदि यह /dev/randomलिनक्स पर उपयोग करता है, तो यह पर्याप्त एन्ट्रापी के निर्माण के लिए प्रतीक्षा को अवरुद्ध कर सकता है। आप प्रदर्शन के दंड से कैसे बचते हैं?

क्या किसी ने इस समस्या के समाधान के रूप में असामान्य गणित का उपयोग किया है?

क्या कोई पुष्टि कर सकता है कि जेडीके 6 में इस प्रदर्शन की समस्या हल हो गई है?


ऐसा लगता है कि यह SecureRandom.generateSeed () सुस्ती से संबंधित है । धीमेपन
AlikElzin-kilaka

बाहर की जाँच करें / dev / urandom (not / dev / random) .. यदि अवरोधक समस्या है तो बस एक यादृच्छिक संख्या जनरेटर को यूरेनियम से प्राप्त करने पर विचार करें।
jcalfee314

विंडोज से संबंधित: stackoverflow.com/questions/49322948/…
patrikbeno

जवाबों:


79

यदि आप सही यादृच्छिक डेटा चाहते हैं, तो दुर्भाग्य से आपको इसके लिए इंतजार करना होगा। इसमें SecureRandomPRNG के लिए बीज शामिल है । असामान्य गणित वास्तविक यादृच्छिक डेटा को किसी भी तेजी से इकट्ठा नहीं कर सकता है SecureRandom, हालांकि यह किसी विशेष वेबसाइट से बीज डेटा डाउनलोड करने के लिए इंटरनेट से कनेक्ट हो सकता है। मेरा अनुमान है कि यह /dev/randomजहां उपलब्ध है, उससे अधिक तेज़ होने की संभावना नहीं है।

यदि आप PRNG चाहते हैं, तो कुछ इस तरह करें:

SecureRandom.getInstance("SHA1PRNG");

जो तार समर्थित हैं SecureRandom, वह एसपीआई प्रदाता पर निर्भर करता है , लेकिन आप इनका उपयोग कर Security.getProviders()और गणना कर सकते हैं Provider.getService()

सूर्य SHA1PRNG का शौकीन है, इसलिए यह व्यापक रूप से उपलब्ध है। यह विशेष रूप से तेज़ नहीं है क्योंकि PRNGs जाते हैं, लेकिन PRNGs केवल संख्या को कम करने वाले होंगे, न कि प्रवेश के भौतिक माप के लिए अवरुद्ध।

अपवाद यह है कि यदि आप setSeed()डेटा प्राप्त करने से पहले कॉल नहीं करते हैं , तो PRNG पहली बार कॉल करने next()या कॉल करने के बाद खुद को बीज देगा nextBytes()। यह आमतौर पर सिस्टम से काफी कम मात्रा में यादृच्छिक यादृच्छिक डेटा का उपयोग करके ऐसा करेगा। यह कॉल ब्लॉक कर सकती है, लेकिन आपके यादृच्छिक संख्याओं के स्रोत को "पीआईडी ​​के साथ वर्तमान समय के साथ-साथ, 27 जोड़, और सर्वश्रेष्ठ के लिए आशा" की तुलना में कहीं अधिक सुरक्षित बना देगा। यदि आपको एक गेम के लिए सभी यादृच्छिक संख्याओं की आवश्यकता है, हालांकि, या यदि आप चाहते हैं कि परीक्षण प्रयोजनों के लिए एक ही बीज का उपयोग करके भविष्य में धारा दोहराई जा सके, तो एक असुरक्षित बीज अभी भी उपयोगी है।


Uncommons Maths केवल बीजारोपण के लिए इंटरनेट से डेटा डाउनलोड करता है, यह यादृच्छिक संख्या उत्पन्न करते समय उस यादृच्छिक डेटा को वापस नहीं करता है।
डैन डायर

SecureRandom के साथ भी - / dev / urandom केवल बोने के लिए है।
एवीडी

हां। जब प्रश्नकर्ता कहता है कि "यदि आप एक रैंडम नंबर चाहते हैं तो आप सिक्योर रैंडम का उपयोग करें - यह धीमा हो सकता है", मैंने सोचा कि शायद वह हर चीज के लिए गेटसाइड का उपयोग कर रहा है और अपने एंट्रोपी पूल को सूखा रहा है। फिक्स JDK 6 पाने के लिए नहीं है, यह SecureRandom जिस तरह से इरादा है का उपयोग करने के लिए ;-)
स्टीव जेसप

@ डान डायर - मैंने असामान्य मैथ्स के बारे में अपनी टिप्पणी को ठीक किया है। मैंने आपके पृष्ठ पर एक नज़र डाला, इसलिए मुझे पता था कि "यादृच्छिक संख्या" से मेरा मतलब "इसके बीज के लिए" था, बल्कि "उपयोगकर्ता को वापस करने के लिए"। लेकिन आप काफी सही हैं जो मैंने नहीं कहा ...
स्टीव जेसप

"यह व्यापक रूप से उपलब्ध है"। क्या यह हर आज्ञाकारी JDK के साथ शामिल नहीं है ? यह जावा सुरक्षा मानक नामों की सूची में है ... ( docs.oracle.com/javase/8/docs/technotes/guides/security/… )
सीन रेइली

176

आपको लिनक्स का उपयोग करते हुए तेज-लेकिन-थोड़ा-कम-सुरक्षित / देव / यूरेनियम का चयन करने में सक्षम होना चाहिए:

-Djava.security.egd=file:/dev/urandom

हालाँकि, यह जावा 5 और बाद में ( जावा बग 6202721 ) के साथ काम नहीं करता है । सुझाए गए कार्य का उपयोग करना है:

-Djava.security.egd=file:/dev/./urandom

(अतिरिक्त नोट करें /./)


24
ध्यान दें कि जावा बग रिपोर्ट "दोष नहीं" कहती है। दूसरे शब्दों में, भले ही डिफ़ॉल्ट है /dev/urandom, सूर्य इसे एक जादुई स्ट्रिंग के रूप में मानता है और /dev/randomवैसे भी उपयोग करता है, इसलिए आपको इसे नकली करना होगा। file:URL कब URL नहीं है file:? जब भी सूर्य यह निर्णय लेता है :-(
जिम गैरिसन

6
इसे जांचने में बस कुछ समय लगा है, ऐसा लगता है कि सामान्य सेटिंग, यहाँ तक कि java.security फ़ाइल में file:/dev/urandomसेट -Djava.security.egdया इन के साथ securerandom.source, /dev/random/अभी भी जब भी पढ़ा जाता है SecureRandom.getSeed()(या setSeed()कहा जाता है)। साथ वैकल्पिक हल file:/dev/./urandomपढ़ नहीं में परिणाम /dev/randomबिल्कुल (strace के साथ पुष्टि की)
बी मैट

7
/dev/urandom/dev/randomआधुनिक CSPRNG के साथ लागू होने से कम सुरक्षित नहीं है : en.wikipedia.org/wiki//dev/random#FreeBSD
lapo

मुझे लगता है कि मुख्य डर /dev/urandom/यह है कि क्या होता है यदि आप इसका उपयोग नए हार्डवेयर को बॉक्स से बाहर के रहस्यों को उत्पन्न करने के लिए करते हैं, जो कि काफी अनुमानित स्थिति में हो सकता है। /dev/urandom/भले ही यह एक ऐसा मामला नहीं है जहाँ आपको एक मामला दर्ज करना चाहिए। स्थिति और भी बदतर है अगर रहस्य लगातार है, जैसे कि अगर आपका डिवाइस पहली बूट पर करता है तो सार्वजनिक-निजी कुंजी जोड़ी उत्पन्न होती है। उन डरावनी स्थितियों के बाहर, एक अच्छा वैसे भी /dev/urandomआम SecureRandomएल्गोरिदम का उपयोग करने से बेहतर है ।
स्टीव जेसोप

1
कौनसा सही है ? -Djava.security.egd = फ़ाइल: / dev /./ यूरेनियम या फ़ाइल: /// dev / urandom @mattb
आरिश रमेश

35

लिनक्स पर, के लिए डिफ़ॉल्ट कार्यान्वयन SecureRandomहै NativePRNG(स्रोत कोड यहां ), जो बहुत धीमा हो जाता है। विंडोज पर, डिफ़ॉल्ट हैSHA1PRNG , जैसा कि दूसरों ने बताया कि आप लिनक्स पर भी इसका उपयोग कर सकते हैं यदि आप इसे स्पष्ट रूप से निर्दिष्ट करते हैं।

NativePRNGSHA1PRNGमैथ्स और एंकोनसन मैथ्स AESCounterRNG से अलग है कि यह ऑपरेटिंग सिस्टम से लगातार एन्ट्रापी प्राप्त करता है (द्वारा से)/dev/urandom )। अन्य PRNG बोने के बाद किसी भी अतिरिक्त एन्ट्रापी का अधिग्रहण नहीं करते हैं।

AESCounterRNG से लगभग 10 गुना तेज है SHA1PRNG, जो IIRC खुद से दो या तीन गुना तेज हैNativePRNG

यदि आपको एक तेज PRNG की आवश्यकता है जो आरंभीकरण के बाद एन्ट्रॉपी प्राप्त करता है, तो देखें कि क्या आप Fortuna का जावा कार्यान्वयन पा सकते हैं । एक Fortuna कार्यान्वयन का मूल PRNG AESCounterRNG द्वारा उपयोग किया जाता है, लेकिन एंट्रॉपी पूलिंग और स्वचालित पुन: संचालन की एक परिष्कृत प्रणाली भी है।


यह लिंक काम नहीं कर रहा है। uncommons-maths.dev.java.net/nonav/api/org/uncommons/maths/… । वहाँ कहीं भी मैं यह देख सकता हूँ?
यूवीएम

@Unni बस लिंक को अपडेट किया। कृपया ध्यान दें कि मैंने इस उत्तर में किए गए प्रदर्शन के दावे किसी भी अधिक मान्य नहीं हो सकते हैं। मुझे लगता है कि जावा के हाल के संस्करणों में चीजें बेहतर हो सकती हैं और प्लेटफार्मों (यानी विंडोज बनाम Liux) के बीच प्रदर्शन में अंतर हो सकता है।
डैन डायर

मैं एक MessageDigest के साथ SecureRandom का सिर्फ एक उदाहरण चला रहा था और इसे एक षट्भुज बना दिया। मेरी विंडोज़ 7 पीसी में पूरे ऑपरेशन में 33 मिलीसेकंड लगे। क्या यह एक मुद्दा है। मैंने SHA1PRNG.SecureRandomRng = SecureRandom.getInstance ("SHA1PRNG") का उपयोग किया; स्ट्रिंग randomNum = नया पूर्णांक (prng.nextInt ()) .toString (); MessageDigest sha = MessageDigest.getInstance ("SHA-1"); परिणाम = sha.digest (randomNum.getBytes ()); str = hexEncode (परिणाम);
यूवीएम

24

कई लिनक्स डिस्ट्रोस (ज्यादातर डेबियन-आधारित) /dev/randomएन्ट्रॉपी के लिए उपयोग करने के लिए OpenJDK को कॉन्फ़िगर करते हैं ।

/dev/random धीमी गति से परिभाषा है (और ब्लॉक भी कर सकते हैं)।

यहां से आपके पास इसे अनब्लॉक करने के दो विकल्प हैं:

  1. एन्ट्रापी में सुधार, या
  2. यादृच्छिकता आवश्यकताओं को कम करें।

विकल्प 1, एन्ट्रापी में सुधार

में अधिक एन्ट्रापी प्राप्त करने के लिए /dev/random, हैज डेमॉन का प्रयास करें । यह एक ऐसा डेमन है जो लगातार HAVEGE एन्ट्रॉपी इकट्ठा करता है, और एक वर्चुअलाइज्ड वातावरण में भी काम करता है क्योंकि इसमें किसी विशेष हार्डवेयर की आवश्यकता नहीं होती है, केवल सीपीयू ही और एक घड़ी।

उबंटू / डेबियन पर:

apt-get install haveged
update-rc.d haveged defaults
service haveged start

RHEL / CentOS पर:

yum install haveged
systemctl enable haveged
systemctl start haveged

विकल्प 2. यादृच्छिकता आवश्यकताओं को कम करें

यदि किसी कारण से ऊपर का समाधान मदद नहीं करता है या आप क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिकता के बारे में परवाह नहीं करते हैं, तो आप /dev/urandomइसके बजाय स्विच कर सकते हैं , जिसे ब्लॉक नहीं करने की गारंटी है।

विश्व स्तर पर ऐसा करने के लिए, jre/lib/security/java.securityउपयोग करने के लिए अपने डिफ़ॉल्ट जावा इंस्टॉलेशन में फ़ाइल को संपादित करें /dev/urandom(एक और बग के कारण इसे निर्दिष्ट करने की आवश्यकता है /dev/./urandom)।

ऐशे ही:

#securerandom.source=file:/dev/random
securerandom.source=file:/dev/./urandom

तब आपको कभी भी इसे कमांड लाइन पर निर्दिष्ट नहीं करना पड़ेगा।


नोट: यदि आप क्रिप्टोग्राफी करते हैं, तो आप की जरूरत है अच्छा एन्ट्रापी। बिंदु में मामला - एंड्रॉइड PRNG समस्या ने बिटकॉइन वॉलेट की सुरक्षा को कम कर दिया।


अपना उत्तर दिया, लेकिन " /dev/randomपरिभाषा धीमी है (और ब्लॉक भी कर सकते हैं)" गलत है; यह पूरी तरह से सिस्टम कॉन्फ़िगरेशन पर निर्भर करता है। नई मशीनों सीपीयू कि इस्तेमाल किया जा सकता में जैसे एक तेजी से RNG हो सकता है, और बीएसडी मशीनों आम तौर पर के लिए एक ही कार्यान्वयन /dev/randomऔर /devl/urandom। फिर भी, आपको शायद जल्दी होने पर भरोसा नहीं करना चाहिए /dev/random, जरूरी है। वीएम पर आप क्लाइंट वीएम पर क्लाइंट टूलसेट स्थापित करना चाह सकते हैं ताकि होस्ट ओएस के आरएनजी का उपयोग कर सकें।
Maarten Bodewes

17

मुझे SecureRandomहेडलेस डेबियन सर्वर पर एक समय में लगभग 25 सेकंड तक ब्लॉक करने वाली कॉल के साथ एक समान समस्या थी । मैंने havegedयह सुनिश्चित करने के लिए डेमॉन को स्थापित किया है कि /dev/randomशीर्ष पर रखा जाए, हेडलेस सर्वर पर आपको आवश्यक एन्ट्रापी उत्पन्न करने के लिए कुछ इस तरह की आवश्यकता होती है। मेरी कॉल SecureRandomअब शायद मिलीसेकंड लेती है।


4
apt-get install हैग्ड तो अपडेट-rc.d हैव्ड डिफॉल्ट्स
रॉड लीमा

11

यदि आप वास्तव में "क्रिप्टोग्राफिक रूप से मजबूत" यादृच्छिकता चाहते हैं, तो आपको एक मजबूत एंट्रोपी स्रोत की आवश्यकता है। /dev/randomयह धीमा है क्योंकि इसमें एंट्रॉपी (डिस्क रीड्स, नेटवर्क पैकेट्स, माउस मूवमेंट, की प्रेस, आदि) इकट्ठा करने के लिए सिस्टम इवेंट्स का इंतजार करना पड़ता है।

एक तेजी से समाधान एक हार्डवेयर यादृच्छिक संख्या जनरेटर है। आपके पास पहले से ही अपने मदरबोर्ड में एक अंतर्निर्मित हो सकता है; बाहर की जाँच hw_random प्रलेखन पता लगाना आप इसे किया है, और यह कैसे उपयोग करने के लिए पर निर्देश के लिए। रींग-टूल्स पैकेज में एक डेमन शामिल होता है जो हार्डवेयर जनित एंट्रॉपी को फीड करेगा /dev/random

यदि आपके सिस्टम पर एक HRNG उपलब्ध नहीं है, और आप प्रदर्शन के लिए एन्ट्रापी ताकत का त्याग करने के लिए तैयार हैं, तो आप डेटा से एक अच्छा PRNG बीजना चाहेंगे /dev/random, और PRNG को काम करने का मौका दें। कई NIST- अनुमोदित PRNG SP800-90 में सूचीबद्ध हैं जो कि लागू करने के लिए सीधे हैं।


अच्छी बात है, लेकिन मेरा कोड एक व्यावसायिक अनुप्रयोग का हिस्सा है। सर्वर वातावरण पर मेरा कोई नियंत्रण नहीं है। मुझे लगता है कि लक्ष्य सर्वर हमेशा माउस और कीबोर्ड के बिना होते हैं और एंट्रोपी के लिए पूरी तरह से डिस्क और नेटवर्क I / O पर भरोसा करते हैं, जो कि संभवतः मूल समस्या है।
डेविड जी

3
मुझे पता चला कि / देव / यादृच्छिक प्रणाली की घटनाओं पर निर्भर थे, इसलिए एक अस्थायी वर्कअराउंड के रूप में, मैंने अपना माउस आगे पीछे किया, जबकि मेरा परीक्षण चला। ....
डेविड के

I820 चिपसेट के लिए 82802 हब दर्द रहित रूप से धीमा (RIP) था। मुझे आश्चर्य है कि आप इससे उपयोगी कुछ भी इकट्ठा कर सकते हैं। मुझे लगता है कि मैंने ऑक्टेट इकट्ठा करने के बजाय उस पर अवरुद्ध होने में अधिक समय बिताया।
jww

6

जावा 8 का उपयोग करते हुए, मैंने पाया कि लिनक्स कॉलिंग पर SecureRandom.getInstanceStrong()मुझे NativePRNGBlockingएल्गोरिथ्म मिलेगा । यह अक्सर नमक के कुछ बाइट्स उत्पन्न करने के लिए कई सेकंड के लिए ब्लॉक होता है।

मैं NativePRNGNonBlockingइसके बजाय स्पष्ट रूप से मांग कर रहा हूं , और जैसा कि नाम से अपेक्षित था, अब यह अवरुद्ध नहीं है। मुझे पता नहीं है कि इसके सुरक्षा निहितार्थ क्या हैं। संभवतः गैर-अवरोधक संस्करण उपयोग की जा रही एन्ट्रापी की मात्रा की गारंटी नहीं दे सकता है।

अपडेट : ठीक है, मुझे यह उत्कृष्ट स्पष्टीकरण मिला ।

संक्षेप में, अवरुद्ध से बचने के लिए, का उपयोग करें new SecureRandom()। यह उपयोग करता है /dev/urandom, जो ब्लॉक नहीं करता है और मूल रूप से उतना ही सुरक्षित है /dev/random। पोस्ट से: "केवल उस समय जब आप कॉल करना चाहते हैं / देव / यादृच्छिक है जब मशीन पहली बार बूट हो रही है, और एन्ट्रॉपी अभी तक जमा नहीं हुई है"।

SecureRandom.getInstanceStrong() आपको पूर्ण रूप से सबसे मजबूत आरएनजी देता है, लेकिन यह केवल उन स्थितियों में उपयोग करने के लिए सुरक्षित है जहां अवरुद्ध होने का एक गुच्छा आपको प्रभावित नहीं करेगा।


1
मैं केवल दीर्घकालिक कुंजी के लिए अनुमति देता हूं getInstanceStrong(), जैसे कि टीएलएस प्रमाणपत्र के लिए। और फिर भी मैं उपयोग new SecureRandom()या एक आज्ञाकारी प्रमुख जोड़ी जनरेटर या यादृच्छिक संख्या जनरेटर का उपयोग करना होगा । तो हां, यह एक उत्तर प्रदान करता है, अगर /dev/urandom ब्लॉक नहीं होता है: अंत में यह अभी भी सिस्टम एंट्रॉपी पर निर्भर करता है; लेकिन यह सामान्य रूप से बहुत अच्छी सलाह है । यदि /dev/urandomब्लॉक आपको अपने जावा एप्लिकेशन के बजाय समस्या का स्रोत ठीक करना पड़ सकता है।
Maarten Bodewes

5

एक उपकरण है (कम से कम उबंटू पर) जो आपके सिस्टम में कृत्रिम यादृच्छिकता को खिलाएगा। आदेश बस है:

rngd -r /dev/urandom

और आपको सबसे आगे एक सुडो की आवश्यकता हो सकती है। यदि आपके पास रेन्ग-टूल्स पैकेज नहीं है, तो आपको इसे स्थापित करने की आवश्यकता होगी। मैंने यह कोशिश की, और इसने निश्चित रूप से मेरी मदद की!

स्रोत: मैट बनाम दुनिया


2
यह कुछ हद तक खतरनाक है क्योंकि यह लिनक्स कर्नेल के एन्ट्रापी स्तर के आकलन, सिस्टम-वाइड को पूरी तरह से निष्क्रिय कर देता है। मैं परीक्षण उद्देश्यों के लिए सोचता हूं (पढ़ता है: जेन्किंस एक ऐप के टेस्टसुइट चलाने वाले) /dev ///random का उपयोग कर ठीक है, लेकिन उत्पादन में, यह नहीं है।
mirabilos

यह वास्तव में एकमात्र समाधान है जो मेरे लिए काम करता है। जेनकिंस सीआई पर ग्रैडल के साथ एक एंड्रॉइड प्रोजेक्ट बनाते समय मुझे "पर्याप्त पर्याप्त एन्ट्रापी" समस्या नहीं थी, और निर्माण के लिए एक पैरामीटर पारित करने से मदद नहीं मिली।
स्लाव

मुझे sudo rngd -r /dev/urandomsudo apt install rng-tools
MrMesees

5

मैंने उसी मुद्दे का सामना किया । सही खोज शब्दों के साथ कुछ Googling के बाद, मुझे DigitalOcean पर यह अच्छा लेख आया ।

सुरक्षा के साथ समझौता किए बिना हैवेड एक संभावित समाधान है।

मैं यहां लेख से संबंधित भाग को उद्धृत कर रहा हूं।

HAVEGE सिद्धांत के आधार पर, और पहले इसके संबद्ध पुस्तकालय के आधार पर, एक प्रोसेसर पर कोड निष्पादन समय में भिन्नता के आधार पर रैंडमनेस उत्पन्न करने की अनुमति देता है। चूंकि एक ही कोड को निष्पादित करने के लिए एक ही सटीक समय लेने के लिए कोड के एक टुकड़े के लिए यह लगभग असंभव है, यहां तक ​​कि एक ही हार्डवेयर पर समान वातावरण में, एक या एक से अधिक प्रोग्राम चलाने का समय एक यादृच्छिक स्रोत के लिए उपयुक्त होना चाहिए। आपके प्रोसेसर के टाइम स्टैम्प काउंटर (TSC) में बार-बार एक लूप निष्पादित करने के बाद अंतर का उपयोग करके आपके सिस्टम के रैंडम सोर्स (आमतौर पर / dev / रैंडम) के साथ हैवेड इम्प्लीमेंटेशन सीड्स

कैसे स्थापित करने के लिए है

इस लेख में दिए गए चरणों का पालन करें। https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged

मैंने इसे यहां पोस्ट किया है


5

आपके द्वारा संदर्भित समस्या एल्गोरिथम के /dev/randomसाथ नहीं SecureRandomहै, लेकिन यादृच्छिकता के स्रोत के साथ है जो इसका उपयोग करता है। दो ऑर्थोगोनल हैं। आपको यह पता लगाना चाहिए कि दोनों में से कौन सा आपको धीमा कर रहा है।

असामान्य गणित पृष्ठ जिसे आपने स्पष्ट रूप से उल्लेख किया है कि वे यादृच्छिकता के स्रोत को संबोधित नहीं कर रहे हैं।

आप विभिन्न JCE प्रदाताओं, जैसे कि BouncyCastle, को यह देखने के लिए आज़मा सकते हैं कि उनका कार्यान्वयन SecureRandomतेज़ है या नहीं।

एक संक्षिप्त खोज लिनक्स पैच को भी प्रकट करती है जो फोर्टुना के साथ डिफ़ॉल्ट कार्यान्वयन को प्रतिस्थापित करती है। मुझे इस बारे में अधिक जानकारी नहीं है, लेकिन आपका स्वागत है।

मुझे यह भी उल्लेख करना चाहिए कि जब एक बुरी तरह से लागू किए गए SecureRandomएल्गोरिथ्म और / या यादृच्छिकता स्रोत का उपयोग करना बहुत खतरनाक है , तो आप अपने जेसीई प्रदाता को कस्टम कार्यान्वयन के साथ रोल कर सकते हैं SecureRandomSpi। आपको अपने प्रदाता के हस्ताक्षर लेने के लिए सूर्य के साथ एक प्रक्रिया से गुजरना होगा, लेकिन यह वास्तव में बहुत सीधा है; उन्हें बस आपको यह बताने की ज़रूरत है कि आप क्रिप्टो पुस्तकालयों पर अमेरिकी निर्यात प्रतिबंधों के बारे में जानते हैं।


यदि वे एन्ट्रापी के किसी अन्य स्रोत का उपयोग करते हैं, तो उन विभिन्न जेसीई प्रदाताओं का उपयोग केवल होता है, जिसका अर्थ है कि उन्हें हार्डवेयर के एक विशिष्ट टुकड़े का उपयोग करना होगा, जैसे कि एचएसएम। अन्यथा वे केवल मंदी का अनुभव करने की संभावना रखते हैं, यह इस बात पर निर्भर करता है कि वे सिस्टम से कितना एन्ट्रोपी निकालते हैं।
Maarten Bodewes

3

आवर्तक एल्गोरिथ्म के लिए आरंभीकरण स्रोत के रूप में सुरक्षित यादृच्छिक का उपयोग करें; आप असामान्य कार्य में एक के बजाय बल्क वर्क के लिए एक मेर्सेन ट्विस्टर का उपयोग कर सकते हैं, जो कुछ समय के लिए आस-पास रहा है और अन्य चुभन से बेहतर साबित हुआ है

http://en.wikipedia.org/wiki/Mersenne_twister

प्रारंभ करने के लिए अभी और फिर सुरक्षित रैंडम का उपयोग करना सुनिश्चित करें, उदाहरण के लिए, आप प्रति ग्राहक एक सुरक्षित रैंडम उत्पन्न कर सकते हैं, प्रति ग्राहक एक मर्सन ट्विस्टर छद्म रैंडम जनरेटर का उपयोग करके, रैंडमाइजेशन की उच्च पर्याप्त डिग्री प्राप्त कर सकते हैं।


2
यह जवाब गलत है: Mersenne ट्विस्टर है नहीं एक सुरक्षित यादृच्छिक संख्या जनरेटर। यह एक अच्छा एल्गोरिथ्म होगा Random, लेकिन इसके लिए नहीं SecureRandom
Maarten Bodewes

3

प्रलेखन के अनुसार , सिक्योर रैंडम द्वारा उपयोग किए जाने वाले विभिन्न एल्गोरिदम वरीयता के क्रम में हैं:

  • अधिकांश * NIX सिस्टम पर
    1. NativePRNG
    2. SHA1PRNG
    3. NativePRNGBlocking
    4. NativePRNGNonBlocking
  • विंडोज सिस्टम पर
    1. SHA1PRNG
    2. विंडोज PRNG

चूंकि आपने लिनक्स के बारे में पूछा था, इसलिए मैं विंडोज के कार्यान्वयन को नजरअंदाज कर रहा हूं, साथ ही SunPKCS11 जो केवल सोलारिस पर उपलब्ध है, जब तक कि आप इसे स्वयं स्थापित नहीं करते - और तब आप यह नहीं पूछ रहे होंगे।

उन्हीं प्रलेखन के अनुसार, इन एल्गोरिदम का उपयोग क्या है

SHA1PRNG
प्रारंभिक बीजारोपण वर्तमान में सिस्टम विशेषताओं और java.security एंट्रोपी सभा उपकरण के संयोजन के माध्यम से किया जाता है।

NativePRNG
nextBytes() उपयोग /dev/urandom
generateSeed()करता है/dev/random

NativePRNGBlocking
nextBytes() और generateSeed()उपयोग/dev/random

NativePRNGNonBlocking
nextBytes() और generateSeed()उपयोग/dev/urandom

इसका मतलब है कि यदि आप उपयोग करते हैं SecureRandom random = new SecureRandom(), तो यह उस सूची तक नीचे चला जाता है जब तक कि यह एक काम नहीं करता है, जो आमतौर पर मूल निवासी होगा। और इसका मतलब है कि यह खुद से बीज /dev/random(या उपयोग करता है कि यदि आप स्पष्ट रूप से एक बीज उत्पन्न करते हैं), तो उपयोग करता है/dev/urandom अगले बाइट्स, इन्ट्स, डबल, बूलियन, व्हाट्स-हैव्स प्राप्त करने के लिए ।

चूंकि /dev/randomअवरुद्ध है (यह एंट्रॉपी पूल में पर्याप्त एन्ट्रापी होने तक ब्लॉक करता है), जो प्रदर्शन को बाधित कर सकता है।

इसका एक समाधान पर्याप्त एन्ट्रापी उत्पन्न करने के लिए जाली की तरह कुछ का उपयोग कर रहा है, दूसरा समाधान /dev/urandomइसके बजाय उपयोग कर रहा है । जबकि आप यह निर्धारित कर सकते हैं कि पूरे jvm के लिए, एक बेहतर समाधान इसका SecureRandomउपयोग करके, इस विशिष्ट उदाहरण के लिए कर रहा है SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")। ध्यान दें कि यदि NativePRNGNonBlocking है, तो विधि NoSuchAl एल्गोरिदम को फेंक सकती है, इसलिए डिफ़ॉल्ट पर वापस आने के लिए तैयार रहें।

SecureRandom random;
try {
    random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
    random = new SecureRandom();
}

यह भी ध्यान दें कि अन्य * निक्स सिस्टम पर, /dev/urandomअलग तरह से व्यवहार कर सकते हैं


क्या /dev/urandomयादृच्छिक पर्याप्त है?

पारंपरिक ज्ञान यह है कि केवल /dev/randomयादृच्छिक यादृच्छिक है। हालाँकि, कुछ आवाज़ें अलग हैं। में "उपयोग SecureRandom के लिए सही रास्ता" और "/ dev / urandom के बारे में मिथक" , यह तर्क दिया जाता है कि /dev/urandom/है सिर्फ अच्छे के रूप में।

सूचना सुरक्षा ढेर पर उपयोगकर्ता इससे सहमत हैं । मूल रूप से, यदि आपको पूछना है, तो /dev/urandomअपने उद्देश्य के लिए ठीक है।


2

मैं खुद इस समस्या के खिलाफ नहीं आया हूं, लेकिन मैं कार्यक्रम की शुरुआत में एक धागा पैदा करूंगा जो तुरंत एक बीज उत्पन्न करने की कोशिश करता है, फिर मर जाता है। जिस विधि से आप रंडियों को बुलाते हैं, वह उस धागे में शामिल हो जाएगी यदि यह जीवित है तो पहली कॉल केवल तभी ब्लॉक होती है जब यह प्रोग्राम निष्पादन में बहुत पहले होता है।


यह एक अतिवादी हैक है, लेकिन यह काम कर सकता है; यह नहीं कहा जाता है कि प्रयुक्त PRNG अतिरिक्त बीज सामग्री का उपयोग नहीं कर सकता है जो अभी भी अवरुद्ध करने के लिए नेतृत्व कर सकता है। सिस्टम में एन्ट्रापी प्रदान करने या ठीक करने वाले एक अलग यादृच्छिक संख्या का उपयोग करना दृढ़ता से पसंद किया जाना चाहिए। जैसा कि यह कम से कम एक अस्थायी समाधान प्रदान कर सकता है, मैंने उत्तर को कम-से-कम वोट नहीं दिया है।
मार्टन बोदवेस

2

मेरा अनुभव केवल PRNG की धीमी शुरुआत के साथ रहा है, उसके बाद यादृच्छिक डेटा की पीढ़ी के साथ नहीं। अधिक उत्सुक आरंभिक रणनीति आजमाएं। चूंकि वे बनाने के लिए महंगे हैं, इसे एक सिंगलटन की तरह मानते हैं और उसी उदाहरण का पुन: उपयोग करते हैं। यदि एक उदाहरण के लिए बहुत अधिक धागा विवाद है, तो उन्हें पूल करें या उन्हें थ्रेड-स्थानीय बनाएं।

यादृच्छिक संख्या पीढ़ी पर समझौता न करें। वहां की एक कमजोरी आपकी सारी सुरक्षा से समझौता कर लेती है।

मुझे बहुत सारे COTS परमाणु-क्षय-आधारित जनरेटर नहीं दिखते हैं, लेकिन उनके लिए कई योजनाएं हैं, अगर आपको वास्तव में बहुत सारे यादृच्छिक डेटा की आवश्यकता है। एक साइट जिसमें हॉटबिट्स देखने के लिए हमेशा दिलचस्प चीजें होती हैं, वह जॉन वॉकर का फोरमिल्लाब है।


1
मैं हमेशा इस बारे में सोचता था, क्योंकि हैड्रॉनिक ताऊ क्षय उत्पाद लगभग एक यादृच्छिक स्रोत के आदर्श को प्राप्त करता है, जिसे मैं एल्गोरिथम टूल के बजाय इसका उपयोग करने की अपनी इच्छा से छुटकारा नहीं पा सकता हूं। ऑप के उद्देश्य के लिए, मैंने बहुत पहले फैसला किया था कि कुछ फ्रंट-एंड समय सभी सुरक्षित टूल के लिए स्थानिक है। अगर किसी को एक रैंडमाइज़र की ज़रूरत होती है, जिसे कंस्ट्रक्टर में बुलाया जा सकता है और बस पेज लोड समय पर एक निर्माण करने के लिए याद रखना चाहिए, तो इसे एवल स्वैप-इन के नीचे दफन किया जाता है और यहां तक ​​कि जैसे ही मैं इसे अन-नोट करता हूं, वैसे ही पिकी।
निकोलस जॉर्डन

इंटेल 8xx चिपसेट (और शायद कई अन्य) में एक हार्डवेयर आरएनजी है जो थर्मल शोर का उपयोग करता है, वास्तव में अप्रत्याशित क्वांटम प्रभाव है। विश्वसनीय प्लेटफ़ॉर्म मॉड्यूल में हार्डवेयर RNG भी हो सकते हैं, लेकिन दुर्भाग्य से, मेरे लैपटॉप में ऐसा नहीं है।
एरिक्सन

यह विशिष्ट RNG पर निर्भर करता है अगर यह एक बार बीज देता है या यदि यह थोड़ी देर के बाद फिर से शुरू होता है। NIST PRNG को निर्दिष्ट करता है जो कि reseed है, लेकिन कई सॉफ्टवेयर कार्यान्वयन नहीं करते हैं। एक सिंगलटन के चारों ओर कोड को पुनर्संरचना करना एक भयानक विचार है, विशेष रूप से मल्टीथ्रेडेड कार्यान्वयन पर; समस्या के स्रोत को ठीक करना बेहतर है: एन्ट्रापी की कमी के कारण धीमी गति से बोना। यदि आप एक सिंगलटन का उपयोग करते हैं, तो अन्य सिक्योर रैंडम कार्यान्वयन के लिए बीज प्रदान करने के लिए इसका उपयोग करें जो पूरी तरह से नियतात्मक हैं। इस तरह के डिज़ाइन के लिए संभवतः काफी ज्ञान की आवश्यकता होती है।
Maarten Bodewes

@MaartenBodewes वे अच्छे अंक हैं। यदि कार्यान्वयन एक है जो ब्लॉक करता है, सिस्टम एंट्रोपी की प्रतीक्षा कर रहा है, तो मुझे लगता है कि इसे अपने आवेदन में एक सिंगलटन के रूप में व्यवहार करना एक भयानक विचार नहीं है क्योंकि अंतर्निहित स्रोत प्रभावी रूप से एक सिंगलटन है। लेकिन उस एक उदाहरण का दूसरों के लिए उपयोग करना एक अच्छा सुझाव है, भले ही जटिल हो। मुझे यकीन नहीं है, लेकिन मुझे लगता है कि सूर्य (और फिर ओरेकल) प्रदाता SecureRandomने पिछले 10 वर्षों में अपनी एन्ट्रापी सभा में कई बार बदलाव किया है।
इरिकसन

मुझे पूरा यकीन है कि यह काफी बार बदला गया है, इतना है कि मैं इस टिप्पणी में सभी बदलाव करने की कोशिश नहीं करूंगा :)। यह कम संभावना है कि धीमी गति SecureRandomअभी भी एक मुद्दा है, लेकिन एक प्रणाली में कम एन्ट्रापी हमेशा मुद्दा रहेगा। एक सिंगलटन का उपयोग करना दृढ़ता से युग्मित कोड का निर्माण करेगा, जो एक डिजाइन विरोधी पैटर्न है। इसलिए इसका उपयोग अत्यधिक सावधानी के साथ किया जाना चाहिए; यदि आप समस्या ठीक करेंगे तो आपको अधिमानतः कोड के सभी संदर्भों को उलट देना होगा।
मार्टन बॉड्यूज

2

ऐसा लगता है कि आपको अपनी आरएनजी आवश्यकताओं के बारे में स्पष्ट होना चाहिए। सबसे मजबूत क्रिप्टोग्राफ़िक RNG आवश्यकता (जैसा कि मैं इसे समझता हूं) यह होगा कि भले ही आप उन्हें उत्पन्न करने के लिए उपयोग किए जाने वाले एल्गोरिदम को जानते हों, और आप सभी पहले से उत्पन्न यादृच्छिक संख्याओं को जानते हों, आपको किसी भी यादृच्छिक संख्या के बारे में कोई उपयोगी जानकारी नहीं मिल सकती है। भविष्य, कंप्यूटिंग शक्ति की एक अव्यवहारिक राशि खर्च किए बिना।

यदि आपको यादृच्छिकता की इस पूर्ण गारंटी की आवश्यकता नहीं है, तो संभवतः उपयुक्त प्रदर्शन ट्रेडऑफ़ हैं। मैं Uncommons-Maths से AESCounterRNG के बारे में डैन डायर की प्रतिक्रिया , या फ़ोर्टुना (इसके लेखकों में से एक ब्रूस श्नेयर, क्रिप्टोग्राफी के विशेषज्ञ हैं) से सहमत होना चाहूंगा। मैंने कभी भी उपयोग नहीं किया है, लेकिन पहली नज़र में विचार प्रतिष्ठित हैं।

मुझे लगता है कि यदि आप समय-समय पर एक प्रारंभिक यादृच्छिक बीज उत्पन्न कर सकते हैं (जैसे प्रति दिन या घंटे या जो भी हो), तो आप धारा के क्रमबद्ध विखंडू से यादृच्छिक संख्या उत्पन्न करने के लिए एक तेज धारा सिफर का उपयोग कर सकते हैं (यदि धारा सिफर XOR का उपयोग करता है तो बस) नल की धारा में पास या सीधे XOR बिट्स को पकड़ो)। ECRYPT के इस्ट्रीमप्रोजेक्ट में बहुत सारी अच्छी जानकारी है जिसमें प्रदर्शन बेंचमार्क भी शामिल है। यह समय के उन बिंदुओं के बीच में प्रवेश नहीं करेगा जो आप इसे फिर से भरते हैं, इसलिए यदि कोई आपके द्वारा उपयोग किए गए यादृच्छिक संख्याओं और एल्गोरिथ्म में से एक को जानता था, तो तकनीकी रूप से यह संभव हो सकता है, बहुत सारी कंप्यूटिंग शक्ति के साथ, स्ट्रीम सिफर को तोड़ने के लिए और भविष्य की यादृच्छिक संख्या की भविष्यवाणी करने में सक्षम होने के लिए इसकी आंतरिक स्थिति का अनुमान लगाएं। लेकिन आपको यह तय करना होगा कि क्या यह जोखिम और इसके परिणाम एन्ट्रापी बनाए रखने की लागत को सही ठहराने के लिए पर्याप्त हैं।

संपादित करें: यहाँ RNG पर कुछ क्रिप्टोग्राफ़िक पाठ्यक्रम नोट हैं , जो इस विषय पर बहुत प्रासंगिक लगते हैं।


1
"फोर्टुना (इसके लेखकों में से एक ब्रूस श्नाइयर, क्रिप्टोग्राफी के एक विशेषज्ञ हैं)" - और दूसरा नील्स फर्ग्यूसन, क्रिप्टोग्राफी में एक विशेषज्ञ है :-)
स्टीव जेसप

2

यदि आपका हार्डवेयर समर्थन करता है तो यह जावा RdRand यूटिलिटी का उपयोग करने का प्रयास करता है , जिसका मैं लेखक हूँ।

इंटेल के RDRANDनिर्देश पर आधारित है और यह SecureRandomबड़ी मात्रा में क्रियान्वयन के लिए बैंडविड्थ की तुलना में लगभग 10 गुना अधिक तेज है ।


ध्यान दें कि यह कार्यान्वयन केवल उन सीपीयू पर काम करता है जो निर्देश प्रदान करते हैं (अर्थात जब rdrandप्रोसेसर ध्वज सेट होता है)। आपको RdRandRandom()कंस्ट्रक्टर के माध्यम से इसे तुरंत स्पष्ट करने की आवश्यकता है ; कोई विशेष Providerलागू नहीं किया गया है।


3
आप लोग पढ़ना चाहते हैं ।umass.edu/gbecker/BeckerChes13.pdf और केवल Intel RDRAND डेटा का उपयोग कभी न करें । हमेशा इसे कुछ अन्य अप्रत्याशित डेटा के साथ मिलाएं, जैसे कि आरआरसी 4 स्ट्रीम सिफर का उत्पादन (बीज / देव / यूरेनियम से बीजित और उत्पादन के पहले कुछ केबी के साथ उनके ज्ञात पूर्वाग्रह के लिए फेंक दिया गया)।
mirabilos

+1 मिराबिलोस। मुझे लगता RDRANDहै कि यह एक अच्छा स्रोत है, लेकिन यह थोड़ा अविश्वसनीय है। यह निश्चित रूप से एक कलेक्टर (डेविड जॉनसन के लिए कोई अपराध नहीं) में से कई का एक इनपुट होना चाहिए।
jww

मैंने मतदान किया है, लिंक को ठीक किया है और कुछ पृष्ठभूमि जानकारी प्रदान की है। यदि आप सहमत नहीं हैं, तो कृपया संपादन को वापस रोल करें।
Maarten Bodewes

1

कुछ और देखने के लिए फ़ाइल lib / सुरक्षा / java.security में संपत्ति securerandom.source है

/ Dev / random के बजाय / dev / urandom का उपयोग करने के लिए एक प्रदर्शन लाभ हो सकता है। याद रखें कि यदि यादृच्छिक संख्याओं की गुणवत्ता महत्वपूर्ण है, तो समझौता न करें जो सुरक्षा को तोड़ता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.