2011-10-03 9 views
15

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

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

हमारा हार्डवेयर इंटरनेट से कनेक्ट नहीं है। इसलिए, एक एल्गोरिदम इस तरह कार्यान्वित किया जाना चाहिए कि इन चाबियाँ दोनों सर्वर से और डिवाइस के भीतर से उत्पन्न की जा सकें। चाबियों के लिए बीज हार्डवेयर सीरियल नंबर से प्राप्त किए जा सकते हैं, जो दोनों स्थानों पर उपलब्ध है।

मुझे एक साधारण एल्गोरिदम की आवश्यकता है जो अनुक्रमिक संख्याएं ले सकता है और 16-20 अल्फान्यूमेरिक वर्णों की अद्वितीय, गैर अनुक्रमिक कुंजी उत्पन्न कर सकता है।

अद्यतन

SHA-1 जाना सबसे अच्छा तरीका लग रहा है। हालांकि, मैं SHA-1 कुंजी के नमूना आउटपुट से जो देख रहा हूं वह यह है कि वे बहुत लंबे (40 वर्ण) हैं। अगर मैं 40 चार कुंजी लेता हूं और कहता हूं, तो पिछले 16 पात्रों के अलावा सभी को छोटा कर दूंगा?

+0

यदि आप केवल 16 बेस -64 अक्षरों का उपयोग करते हैं तो यह 96 बिट्स है। यदि आप 281474976710656 धारावाहिक संख्याएं उत्पन्न करते हैं (यह 2^36 कुंजी - [जन्मदिन विरोधाभास] (http://en.wikipedia.org/wiki/Birthday_problem) 50 है, तो आप टकराव (पढ़ने: गैर-अद्वितीय सीरियल नंबर) की उम्मीद कर सकते हैं। % बाध्य) –

+0

इनपुट अनुक्रमिक संख्या क्यों होनी चाहिए? –

+0

@ थॉमसएम। डूबुइसन अगर वे $ 2 प्रत्येक के लिए 2^36 लाइसेंस बेचते हैं, तो यह न्यूजीलैंड का सकल घरेलू उत्पाद है। मुझे लगता है कि वे थोड़ी देर के लिए सुरक्षित हैं। –

उत्तर

13

आप डिवाइस के सीरियल नंबर, फीचर नाम/कोड और कुछ गुप्त नमक और हैश का परिणाम SHA1 (या एक और सुरक्षित हैशिंग एल्गोरिदम) के साथ परिणाम को जोड़ सकते हैं। डिवाइस प्रत्येक सुविधा के लिए दिए गए हैश को हैश से तुलना करता है, और यदि यह एक मैच पाता है तो यह सुविधा को सक्षम बनाता है।

वैसे, चरित्र को गिनने के लिए मैं बेसिंग को हैशिंग पास के बाद एन्कोडिंग के रूप में उपयोग करने का सुझाव दूंगा।

SHA-1 जाने का सबसे अच्छा तरीका प्रतीत होता है। हालांकि, मैं SHA-1 कुंजी के नमूना आउटपुट से जो देख रहा हूं वह यह है कि वे बहुत लंबे (40 वर्ण) हैं। अगर मैं 40 char परिणाम लेता हूं और कहता हूं, तो पिछले 16 पात्रों के अलावा सभी को छोटा कर दूंगा?

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

Hex: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 
Base64: qUqP5cyxm6YcTAhz05Hph5gvu9M 

--- संपादित करने के लिए 40 अक्षर से जाना होगा ---

वास्तव में, @Nick जॉनसन के साथ का दावा विश्वसनीय तर्क है कि बड़े सुरक्षा प्रभावों के बिना छंटनी की जा सकती है (जाहिर है कि आप जो भी बिट छोड़ रहे हैं उसके लिए दो बार टकराव की संभावना बढ़ रही है)।

आपको निष्क्रिय रूप से तैयार करने या हैश की कुंजी जोड़ने के बजाय HMAC का भी उपयोग करना चाहिए। विकिपीडिया के अनुसार:

HMAC विनिर्देश के डिजाइन एक हैश समारोह के साथ एक चाबी के संयोजन के लिए अधिक तुच्छ तंत्र पर हमलों के अस्तित्व से प्रेरित हुआ। उदाहरण के लिए, कोई भी वही सुरक्षा मान सकता है जो एचएमएसी प्रदान करता है मैक = एच (कुंजी ∥ संदेश) के साथ प्राप्त किया जा सकता है।हालांकि, यह विधि गंभीर दोष से पीड़ित है: अधिकांश हैश फ़ंक्शंस के साथ, यह कुंजी को जानने के बिना संदेश में डेटा जोड़ने और एक और मान्य मैक प्राप्त करने में आसान है। वैकल्पिक, मैक = एच (संदेश ∥ कुंजी) का उपयोग कुंजी जोड़कर, समस्या यह है कि किसी हमलावर (unkeyed) हैश समारोह में एक टक्कर मिल सकती है मैक में एक टक्कर है से ग्रस्त है। मैक = एच (कुंजी ∥ संदेश ∥ कुंजी) का उपयोग करना बेहतर है, इस दृष्टिकोण के साथ तथापि विभिन्न सुरक्षा कागजात का सुझाव दिया है कमजोरियों है, भी जब दो अलग अलग चाबी इस्तेमाल किया जाता।

इस और लंबाई छिद्र दोनों के सुरक्षा प्रभावों के बारे में अधिक जानकारी के लिए, RFC2104 के अनुभाग 5 और 6 देखें।

+0

यह एक संभावित समाधान है, हालांकि, अगर मैं एक सरल समाधान है कि एक पूर्ण SHA-1 हैश कार्यान्वयन है तो मैं थोड़ा उत्सुक हूं। यदि यह उतना आसान है जितना कि यह प्राप्त करने जा रहा है और अभी भी मेरी आवश्यकताओं को पूरा करता है, तो मैं इस जवाब को स्वीकार कर सकता हूं।हालांकि, मुझे अपना स्वयं का SHA-1 कार्यान्वयन लिखना होगा। – RLH

+1

यह एक अच्छा जवाब है। मैं इंगित करता हूं कि हैश फ़ंक्शन का विकल्प इतना महत्वपूर्ण नहीं है, जब तक कि यह उचित रूप से क्रिप्टोग्राफ़िक रूप से सुरक्षित हो। – Patrick87

+1

@RLH: मुझे नहीं लगता कि आपको SHA-1 कार्यान्वयन लिखने की आवश्यकता है, अनुमोदित ओपन सोर्स लाइसेंस के तहत उपलब्ध सी में तैयार किए गए कार्यान्वयन के भार हैं। –

2

एक विकल्प हैश का वर्णन मैटियो के रूप में करता है।

दूसरा ब्लॉक सिफर (उदा। एईएस) का उपयोग करना है। बस एक यादृच्छिक nonce चुनें और काउंटर के रूप में अपने धारावाहिक संख्या का उपयोग कर counter mode में सिफर का आह्वान करें।

बेशक, इस कुंजी उलटी है, जो या एक वांछनीय संपत्ति नहीं हो सकता कर देगा।

0

आप एक अद्वितीय 64-बिट कुंजी उत्पन्न करने के लिए एक Xorshift random number जनरेटर का उपयोग कर सकते हैं, और फिर जो भी योजना आप चाहते हैं का उपयोग कर कि कुंजी सांकेतिक शब्दों में बदलना। यदि आप बेस -64 का उपयोग करते हैं, तो कुंजी 11 वर्ण लंबी है। यदि आप हेक्स एन्कोडिंग का उपयोग करते हैं, तो कुंजी 16 वर्ण लंबी होगी।

एक्सर्सिफ्ट आरएनजी मूल रूप से थोड़ा सा मिक्सर है, और ऐसे संस्करण हैं जिनकी गारंटी 2^64 है, जिसका अर्थ है कि यह प्रत्येक इनपुट के लिए एक अद्वितीय मूल्य उत्पन्न करने की गारंटी है।

अन्य विकल्प एक रेखीय प्रतिक्रिया शिफ्ट रजिस्टर, जो भी प्रत्येक अलग इनपुट के लिए एक अद्वितीय संख्या उत्पन्न होगा उपयोग करने के लिए है।

+0

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

संबंधित मुद्दे