2008-09-05 17 views
24

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जहां उपयोगकर्ताओं को कॉल करना होगा और अपने फोन के कीपैड के साथ एक सत्यापन नंबर टाइप करना होगा।सत्यापन कोड/संख्या कैसे उत्पन्न करें?

मैं यह पता लगाने में सक्षम होना चाहूंगा कि उनके द्वारा टाइप की गई संख्या सही है या नहीं। फोन सिस्टम में वैध संख्याओं की सूची तक पहुंच नहीं है, बल्कि इसके बजाय यह एल्गोरिदम (जैसे क्रेडिट कार्ड नंबर) के विरुद्ध संख्या को मान्य करेगा।

की आवश्यकताएं इस में से कुछ हैं:

  • यह एक मान्य यादृच्छिक कोड
  • यह अगर मैं एक टाइपो (अंकों की tranposition कर एक मान्य कोड के लिए मुश्किल हो सकता है, गलत टाइप करने के लिए मुश्किल होना चाहिए अंकों)
  • मैं संभावित संयोजनों की reasonnable संख्या होनी चाहिए (के 1M कहते हैं)
  • कोड उपयोगकर्ता से त्रुटियों से बचने के यथासंभव कम किया जाना चाहिए, चलो

इन आवश्यकताओं को देखते हुए, आप इस तरह की संख्या कैसे उत्पन्न करेंगे?

संपादित करें:

@Haaked: कोड यह फोन के साथ है क्योंकि उपयोगकर्ता यह टाइप करें, संख्यात्मक हो गया है।

@matt बी: पहले चरण पर, कोड वेब पेज पर प्रदर्शित होता है, दूसरा चरण कोड को कॉल करना और टाइप करना है। मुझे उपयोगकर्ता का फोन नंबर नहीं पता है।

Folowup: मैं जांच संख्या की वैधता (: checkDigits इस intersting गूगल कोड परियोजना देखें) करने के लिए कई एल्गोरिदम पाया है।

+0

+1, आपके अनुवर्ती लिंक में धन्यवाद के लिए धन्यवाद। –

उत्तर

29

कुछ शोध के बाद, मुझे लगता है कि मैं आईएसओ 7064 मॉड 97,10 फॉर्मूला के साथ जाऊंगा। यह बहुत ठोस लगता है क्योंकि इसका उपयोग आईबीएएन (अंतर्राष्ट्रीय बैंक खाता संख्या) को प्रमाणित करने के लिए किया जाता है।

  1. एक नंबर ले लो:

    सूत्र बहुत सरल है mod(98 - mod(number * 100, 97), 97) => 76

  2. Concat संख्या और चेकसम कोड प्राप्त करने के लिए: 123456
  3. 2 अंक चेकसम प्राप्त करने के लिए निम्न सूत्र लागू करें => 12345676
  4. एक कोड को मान्य करने के लिए, सत्यापित करें कि mod(code, 97) == 1

टेस्ट:

  • mod(12345676, 97) = 1 => अच्छा
  • mod(21345676, 97) = 50 = खराब>!
  • mod(12345678, 97) = 10 => बीएडी!

जाहिर है, यह एल्गोरिदम अधिकांश त्रुटियों को पकड़ता है।

एक और दिलचस्प विकल्प Verhoeff algorithm था। इसमें केवल एक सत्यापन अंक है और इसे लागू करना अधिक कठिन है (उपरोक्त सरल सूत्र की तुलना में)।

+0

यदि विरोधी उपयोगकर्ताओं की अपेक्षा की जाती है (जो कि प्रश्न द्वारा निहित प्रतीत होता है), तो उपयोगकर्ता के लिए इस एल्गोरिदम का उपयोग करके वैध आईडी उत्पन्न करना बहुत आसान होगा। –

+0

शत्रुतापूर्ण उपयोगकर्ता वास्तव में इस एप्लिकेशन में कोई समस्या नहीं थे। फिर भी, मैंने अगले नंबरों का अनुमान लगाने के लिए इसे कम सरल बनाने के लिए "मिश्रण" और "अनमिक्स" बिट्स में कुछ तर्क जोड़ा। – Costo

+2

आईबीएएन जैसी लंबाई के साथ चेकसम की गणना करते समय, ध्यान रखें कि इंटरमीडिएट योग अक्सर हस्ताक्षरित 32-बिट पूर्णांक में फिट नहीं होता है। – AndreKR

4

1 एम संयोजनों के लिए आपको 6 अंकों की आवश्यकता होगी। यह सुनिश्चित करने के लिए कि कोई गलती से वैध कोड नहीं हैं, मैं एक 1/1000 मौके के साथ 9 अंकों का सुझाव देता हूं कि एक यादृच्छिक कोड काम करता है। मैं integrity check करने के लिए एक और अंक (10 कुल) का उपयोग करने का भी सुझाव दूंगा। जहां तक ​​वितरण पैटर्न, यादृच्छिक पर्याप्त होगा और चेक अंक यह सुनिश्चित करेगा कि एक त्रुटि के परिणामस्वरूप सही कोड न हो।

संपादित करें: स्पष्ट रूप से मैंने आपका अनुरोध पूरी तरह से नहीं पढ़ा। क्रेडिट कार्ड नंबर का उपयोग करके, आप उस पर एक हैश कर सकते हैं (MD5 या SHA1 या कुछ समान)। फिर आप एक उचित स्थान पर छेड़छाड़ करते हैं (उदाहरण के लिए 9 अक्षर) और आधार 10 में परिवर्तित करें। फिर आप चेक अंक जोड़ते हैं और यह आपके उद्देश्यों के लिए कम या ज्यादा काम करना चाहिए।

0
  • मैं, संभावित संयोजनों की reasonnable संख्या
  • कोड उपयोगकर्ता से त्रुटियों से बचने के

खैर यथासंभव कम होना चाहिए, (के 1M मान लीजिए) होना चाहिए यदि आप चाहते हैं कि कम से कम एक मिलियन संयोजन हो, तो आपको कम से कम छह अंकों की आवश्यकता है। क्या वह काफी छोटा है?

0

जब आप सत्यापन कोड बना रहे हैं, तो क्या आपके पास कॉलर के फ़ोन नंबर तक पहुंच है?

यदि ऐसा है तो मैं कॉलर के फोन नंबर का उपयोग करता हूं और इसे किसी प्रकार के हैशिंग फ़ंक्शन के माध्यम से चलाता हूं ताकि आप गारंटी दे सकें कि आपने चरण 1 में कॉलर को दिया गया सत्यापन कोड वही है जो वे चरण 2 में प्रवेश कर रहे हैं (यह सुनिश्चित करने के लिए कि वे किसी मित्र के सत्यापन कोड का उपयोग नहीं कर रहे हैं या उन्होंने बस एक बहुत भाग्यशाली अनुमान बनाया है)।

हैशिंग के बारे में, मुझे यकीन नहीं है कि 10 अंकों का नंबर लेना संभव है और हैश परिणाम के साथ बाहर निकलना संभव है < 10 अंक (मुझे लगता है कि आपको टक्कर की एक निश्चित राशि के साथ रहना होगा) लेकिन मुझे लगता है कि यह सुनिश्चित करने में मदद करेगा कि उपयोगकर्ता वह है जो वे कहते हैं कि वे हैं।

बेशक यह फोन नंबर चरण 1 में इस्तेमाल किया है, तो काम नहीं करेगा के

एक वे कदम में से बुला रहे हैं से अलग है 2.

1

यह केवल संख्या होने के लिए है? आप 1 और 1 एम के बीच एक यादृच्छिक संख्या बना सकते हैं (हालांकि मैं यहां तक ​​कि उच्चतर सुझाव देता हूं) और फिर Base32 encode it। अगली चीज़ जो आपको करने की ज़रूरत है वह हैश वह मान (एक गुप्त नमक मूल्य का उपयोग करके) और बेस 32 हैश को एन्कोड करता है। फिर दो स्ट्रिंग्स को एक साथ जोड़ दें, शायद डैश से अलग हो जाएं।

इस तरह, आप आने वाले कोड को एल्गोरिदमिक रूप से सत्यापित कर सकते हैं। आप बस कोड के बाएं तरफ लेते हैं, हैश यह आपके गुप्त नमक का उपयोग कर रहा है, और कोड के दाईं ओर उस मान की तुलना करें।

0

मान लीजिए कि आप पहले ही जानते हैं कि उपयोगकर्ता किस कुंजी को हिट करता है, यह उचित रूप से आसानी से किया जा सकता है। सुरक्षा दुनिया में, "एक बार" पासवर्ड की धारणा है। इसे कभी-कभी "डिस्पोजेबल पासवर्ड" के रूप में भी जाना जाता है। आम तौर पर ये ASCII मानों (आसानी से टाइप करने योग्य) तक सीमित हैं। तो, [ए-जेए-जेड -9] और आसानी से टाइप करने योग्य प्रतीकों का एक गुच्छा। अल्पविराम, अवधि, अर्ध कोलन, और कोष्ठक की तरह। आपके मामले में, हालांकि, आप शायद सीमा को [0-9] तक सीमित करना चाहते हैं और संभवतः * और # शामिल करना चाहते हैं।

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

के बजाय अपने आप को कार्यान्वयन के विवरण को स्पष्ट करने के लिए असफल, मैं तुम्हें एक 9 पेज लेख जहां आप इसे अपने आप पर पढ़ सकते हैं पर निर्दिष्ट कर देंगे: https://www.grc.com/ppp.htm

0

ऐसा लगता है कि आप अनकही आवश्यकता है यह है कि एल्गोरिदम के माध्यम से जल्दी से निर्धारित किया जाना चाहिए, कि कोड मान्य है। इससे आप एक बार पैड संख्याओं की एक सूची सौंप सकते हैं।

अतीत में लोगों ने कई तरीकों से ऐसा किया है।

  1. सार्वजनिक कुंजी और निजी कुंजी बनाएं। निजी कुंजी का उपयोग करके 0- 999, 999 संख्याओं को एन्कोड करें, और परिणाम निकाल दें। परिणाम को लंबे संस्करण तक पहुंचने के लिए आपको कुछ यादृच्छिक संख्याओं में फेंकने की आवश्यकता होगी, और आपको परिणाम 64 से आधार 10 में परिवर्तित करना होगा। जब आपको कोई संख्या दर्ज की जाती है, तो इसे वापस बेस 64 में परिवर्तित करें, निजी कुंजी लागू करें, और देखें कि पूर्णांक संख्या 1,000,000 से कम है (यादृच्छिक संख्याओं को छोड़ दें)।
  2. reversible hash function
  3. किसी विशिष्ट मूल्य पर पीआरएन से पहले मिलियन नंबरों का उपयोग करें। "जांच" फ़ंक्शन बीज प्राप्त कर सकता है, और पता है कि अगले मिलियन मान अच्छे हैं।यह या तो उन्हें हर बार उत्पन्न कर सकता है और कोड प्राप्त होने पर एक-एक करके जांच सकता है, या प्रोग्राम स्टार्टअप पर उन्हें सभी को एक टेबल में संग्रहीत किया जा सकता है, और फिर बाइनरी खोज (अधिकतम तुलना) का उपयोग करें क्योंकि एक मिलियन पूर्णांक पूरी तरह से नहीं है जगह का।

अन्य विकल्पों का एक समूह है, लेकिन ये सामान्य और लागू करने में आसान हैं।

-Adam

0

आप check digits परियोजना से जुड़ा हुआ है, और "एनकोड" समारोह का उपयोग कर एक अच्छा समाधान की तरह लगता है। यह कहता है:

एन्कोड एक अपवाद फेंक सकता है यदि 'खराब' डेटा (उदा। गैर-संख्यात्मक) पास हो जाता है, जबकि सत्यापित केवल सत्य या गलत लौटाता है। यहां विचार यह है कि एन्कोड सामान्य रूप से 'विश्वसनीय' आंतरिक स्रोतों (उदाहरण के लिए डेटाबेस कुंजी) से डेटा प्राप्त करता है, इसलिए यह असाधारण है कि खराब डेटा पारित किया जा रहा है।

तो ऐसा लगता है जैसे आप एन्कोड फ़ंक्शन को डेटाबेस कुंजी (उदाहरण के लिए 5 अंक) पास कर सकते हैं और आप एक संख्या प्राप्त कर सकते हैं जो आपकी आवश्यकताओं को पूरा करेगा।

2

आप अपना कोड विभाजित करना चाहते हैं। इसका हिस्सा शेष कोड का 16-बिट सीआरसी होना चाहिए।

यदि आप चाहते हैं कि एक सत्यापन संख्या है तो केवल अनुक्रम संख्या का उपयोग करें (मान लें कि आपके पास पीढ़ी का एक बिंदु है)। इस तरह आप जानते हैं कि आपको डुप्लिकेट नहीं मिल रहे हैं।

फिर आप उस अनुक्रम संख्या और कुछ निजी कुंजी के सीआरसी -16 के अनुक्रम को उपसर्ग करते हैं। जब तक आप इसे निजी रखते हैं, तब तक आप निजी कुंजी के लिए कुछ भी उपयोग कर सकते हैं। इसे कम से कम GUID बनाएं, लेकिन यह War and Peace from project Gutenberg पर पाठ हो सकता है।बस गुप्त और स्थिर होने की जरूरत है। एक निजी कुंजी होने से लोगों को एक कुंजी बनाने में सक्षम होने से रोकता है, लेकिन 16 बिट सीआर का उपयोग करना इसे तोड़ना आसान बनाता है।

आपको सत्यापित करने के लिए बस संख्या को अपने दो हिस्सों में विभाजित करें, और उसके बाद अनुक्रम संख्या और निजी कुंजी का सीआरसी -16 लें।

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

यह विधि आपको छोटी चाबियों से भी शुरू करने की अनुमति देती है। पहली 10 कुंजी 6 अंक होगी।