2011-05-10 9 views
7

स्टोर करने की कोई ज़रूरत नहीं है, मेरे पास ऐसी स्थिति है जहां हम "छूट कार्ड" के रन प्रिंट करते हैं जहां कार्ड पर एक अनूठा कोड मुद्रित किया जाता है जिसे उपयोगकर्ता छूट के लिए ऑनलाइन स्टोर पर रिडीम कर सकता है।एल्गोरिदम के आधार पर "कूपन कोड" का एक सेट बनाएं; कोड

हम इन कार्डों में से बहुत सारे बनाते हैं, जिनमें से बहुत से वास्तव में उपयोग किए जा रहे हैं, कि मैं किसी डेटाबेस में प्रत्येक व्यक्तिगत कोड को संग्रहीत करने के बजाय किसी विधि का उपयोग करके वैध कोड की पहचान करने के लिए कुछ प्रकार का उपयोग करना चाहता हूं। हम एक समय में इन कोडों में से 5,000 कहते हैं। साल में लगभग 5 बार।

$coupons->generate(5000, 'unique_salt', 'prefix_'); 

कौन सा की तरह 5000 "यादृच्छिक" कोड जेनरेट होगा::

आदर्श रूप में मैं की तरह कुछ करने में सक्षम होना चाहते हैं

prefix-23-3424-4324-3344 or 
prefix-4H-34RE-22K3-PE3W 

unique salt और prefix_ डेटाबेस से बचाया जाएगा । salt को देखने के लिए इन कोडों को prefix_ का उपयोग करके सत्यापित किया जा सकेगा और कोड को मान्य या नहीं पहचानें।

मेरे पास नमक के रूप में संख्या का उपयोग करके काम करने का एक रूप है, नमक द्वारा विभाजित संख्याओं को खोजने के लिए, और फिर अंकों को पुन: क्रमबद्ध करें ताकि यह यादृच्छिक दिखाई दे। लंबे समय तक पर्याप्त कोड के साथ, पैटर्न को समझने में कुछ काम लगेगा। लेकिन मुझे लगता है कि एक बेहतर तरीका है ... क्योंकि केवल इतनी संख्याएं हैं जो बड़ी संख्या में कोड उत्पन्न करती हैं जो salt द्वारा विभाजित होती हैं।

(उदाहरण के लिए, 2 की एक नमक 5,000 कोड 1 और 10,000 के बीच प्राप्त होते हैं (और एक पैटर्न को देखने के लिए) आसान होगा ... लेकिन 14000 के नमक 1 और 10,000 के बीच शून्य कोड प्राप्त होते हैं)

इसका दूसरा लाभ यह है कि मैं आवश्यकतानुसार कूपन उत्पन्न कर सकता हूं (जैसे कि जब हम व्यक्तियों को एक आधार पर एक छूट देते हैं), और prefix_ के आधार पर कूपन का उपयोग कब किया जाता है, ट्रैक करने में सक्षम हो ... और संभावित रूप से देखें कि कार्ड कब पास किए जाते हैं, सबसे अच्छी वापसी क्या होती है।

क्या मैं बस अपने पहियों को कताई कर रहा हूं जब मुझे डेटाबेस में प्रत्येक कोड को संग्रहीत करना चाहिए? (या बस मज़ा आ रहा है?) :)

+0

मैं डेटाबेस में कोड संग्रहीत करने के लिए वोट दूंगा। 5000 x 5 गुना/वर्ष अभी भी केवल 25000 कोड/वर्ष है। प्रति कोड 20-30 बाइट्स पर, आप एक पूर्ण मेगाबाइट मूल्य डेटा भी संग्रहीत नहीं कर रहे हैं। यह कोड को क्रैक करने वाले किसी व्यक्ति के मुद्दे से भी बचाता है। – dlev

+0

आप कुछ यादृच्छिक संख्याओं और अक्षरों का उपयोग कर सकते हैं, और कोड के अंत में जोड़े गए चेक अंकों के कुछ रूप उत्पन्न करने के लिए कुछ अनुक्रमणिका में वर्णों का चयन कर सकते हैं। फिर, जब कोई कोड दर्ज किया जाता है, तो आप केवल वर्णों का चयन करते हैं, एल्गोरिदम चलाते हैं और देखते हैं कि आप अंतिम चरित्र के साथ समाप्त होते हैं या नहीं। –

+0

@ डंकन-हाउ हाँ, मैं वास्तव में अभी अपनी वर्तमान विधि के साथ ऐसा करता हूं। मैं जेनरेट कोड में चेकसम के रूप में जो कुल जोड़ता हूं उसे पाने के लिए मैं कुछ निश्चित अंक चुनता हूं। – drewjoh

उत्तर

4

आप के लिए क्या देख रहे सॉफ्टवेयर सीडी पर आंशिक कुंजी सत्यापन कहा जाता है सीरियल नंबर की तरह :)

पर एक नज़र डालें:

http://47hats.com/2007/07/implementing-a-partial-serial-number-verification-system/

http://www.codeproject.com/KB/security/cdkeys.aspx

http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/

चीयर्स

+0

धन्यवाद! मैंने सोचा कि इसके लिए एक नाम होगा ...बस कोई संकेत नहीं था कि यह क्या था। – drewjoh

1

एक मानक तकनीक नमक पर एक तरफा हैश और बड़ी यादृच्छिक दिखने वाली संख्या बनाने के लिए संख्या का उपयोग करना है। फिर अपने क्रिप्टिक कोड को उत्पन्न करने के लिए इस हैश का उपयोग करें। बहुत सारे मानक एक-तरफा हैंश का उपयोग आप कर सकते हैं। एमडी 5 एक आम है।

अपने जीवन को आसान बनाने के लिए, मैं कोड को कुछ आसान तरीके से एम्बेड कर दूंगा। उदाहरण के लिए उपसर्ग-2_-3_ -4_ -3 ___ कोड 2343 होगा, और फिर आप "उपसर्ग नमक संख्या" के MD5 से डेटा का उपयोग करके रिक्त स्थान भरेंगे। यह कहकर इतना आसान हो सकता है कि आपके पास संख्याओं और पात्रों का वर्णमाला है जो आप n चीजों के साथ उपयोग करने के इच्छुक हैं। अपना पहला चरित्र चुनने के लिए MD5 mod n लें। एमडी 5 को n से विभाजित करें। फिर दोहराएं जब तक कि आपके पास वर्ण न हों। इसे सत्यापित करने के लिए उपसर्ग लें, नमक देखें, संख्या निकालें, एमडी 5 की गणना करें, और कोड में होने वाले अन्य पात्रों को उत्पन्न करने के लिए एक ही प्रक्रिया का पालन करें।

2

आप इसे एचएमएसी और उचित एन्कोडिंग योजना का उपयोग करके कर सकते हैं। सबसे पहले, एचएमएसी के लिए एक गुप्त कुंजी उत्पन्न करें, और सुनिश्चित करें कि आप इसे गोपनीय रखें। प्रत्येक टोकन उत्पन्न करने के लिए, निम्न कार्य करें:

  1. यादृच्छिक या अनुक्रमिक रूप से एक क्रम संख्या उत्पन्न करें - यह सब महत्वपूर्ण है कि यह अद्वितीय है।
  2. गुप्त कुंजी के साथ सीरियल नंबर के एचएमएसी (मैं एचएमएसी-एसएचए 1 का सुझाव देता हूं) की गणना करें। यह आपको हैश वैल्यू देगा (एचएमएसी-एसएचए 1 के मामले में 160 बिट्स)।
  3. हैश मान के हिस्से के साथ सीरियल नंबर को संयोजित करें। यह आपका कूपन कोड है। आपके द्वारा उपयोग किए गए हैश मान के बिट्स की संख्या निर्धारित करता है कि ब्रूट-बल द्वारा वैध कोड बनाना कितना मुश्किल है - एन बिट्स का उपयोग करने का अर्थ है कि आपके हमलावरों को औसत (2) (एन -1) कोड खोजने की आवश्यकता होगी वैध एक हैश से आप किस बिट्स का उपयोग करते हैं इससे कोई फर्क नहीं पड़ता।

    1. चेक कि सीरियल नंबर के रूप में पहले से छुड़ाया अपने डेटाबेस में पहले से ही नहीं है:

    कोड सत्यापित करने के लिए।

  4. ऊपर वर्णित अनुसार सीरियल नंबर के लिए एचएमएसी की गणना करें।
  5. शेष कोड में एचएमएसी के प्रासंगिक बिट्स की तुलना करें।
  6. इसे उपयोग के रूप में पंजीकृत करने के लिए अपने डेटाबेस में सीरियल नंबर जोड़ें।
संबंधित मुद्दे