2009-05-21 16 views
15

मैं एक ऑनलाइन इवेंट टिकटिंग सिस्टम पर काम कर रहा हूं, जहां उपयोगकर्ता अपने टिकट प्रिंट करने और उस कार्यक्रम में दिखाई देने में सक्षम होंगे यह स्कैन किया जाएगा (बारकोड) और आदर्श व्यक्ति में मिल जाएगा मेरे समस्या एक "टिकट कोड" जो निम्न आवश्यकताओं को पूरा बनाने का तरीका है:। प्रत्येक से पर्याप्त रूप से अलग होने की जरूरत हैछोटे (<10 अंक) बनाने के विचार, (बहुत) सुरक्षित "हैश"

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

डेटा की श्रेणी में लाने के लिए केवल आवश्यकता होगी काफी छोटा यह कुंजीयन की सुविधा के लिए होने के लिए अगर जरूरत है बहुत छोटा है, प्रति दिन लगभग 5000 टिकट प्रति ईवेंट (लगभग 100,000 अलग-अलग टिकट कोड) के साथ लगभग 20 कार्यक्रम होंगे,

अब मेरे पास कई फ़ील्ड हैं जो टिकट पर मुद्रित नहीं हैं और उपयोगकर्ता को नहीं जानते हैं मैं "टिकट कोड" के हिस्से को एन्कोड करने के लिए उपयोग कर सकता हूं, इसलिए मैं इवेंटआईडी, ऑर्डरआईडी, इवेंटडेट और कुछ नमक का उपयोग करने के लिए एक छोटा "हैश" बनाने के लिए उपयोग कर सकता हूं कोड (विचार?) की आरटी, लेकिन मैं अभी भी टिकट आईडी के साथ अटक गया हूं जो अनुक्रमिक है या एक GUID (बहुत लंबा होगा)

तो कोई विचार या पॉइंटर्स यह कैसे करें?

+0

@jaimedp मेरे अपडेट को पढ़ें – Unknown

+1

केवल एक सामान्य हैशिंग एल्गोरिदम के बारे में, लेकिन एक छिद्रित हैश के साथ? –

उत्तर

1

टिकट आईडी नंबर परमिट करने के लिए फीस्टल नेटवर्क के आधार पर एक बहुत ही सरल योजना पर विचार करें। This message (जो PostgreSQL सूचियों पर होता है लेकिन पोस्टग्रेएसक्यूएल के साथ वास्तव में बहुत कुछ नहीं है) एक सरल Feistel network का वर्णन करता है। प्रत्येक टिकट पर आप टिकट आईडी नंबर (अनुक्रमिक रूप से चुने गए) को मुद्रित कर सकते हैं, फिर एक "टिकट गुप्त कोड" जो कि फीस्टल नेटवर्क के माध्यम से आईडी नंबर डालने का परिणाम है।संभावित भिन्नताओं में गुप्त कोड में चेक अंक जोड़ना शामिल है, और अनुक्रमिक रूप से जेनरेट किए गए नंबर (संख्या + 10,000 * ईवेंट आईडी संख्या, et cetera) से अधिक पर फ़ीस्टल नेटवर्क में इनपुट को आधार देना शामिल है।

+0

धन्यवाद, इसने मुझे सही दिशा में एक Verhoeff चेक अंक और एक हैश के साथ संयुक्त किया जो मैं पुनर्निर्माण कर सकता हूं। – Jaime

5

मेरा सुझाव है कि आप Verhoeff algorithm को आज़माएं।

+0

यह दिलचस्प लगता है ... – Jaime

3

दो तरीके मैं देख सकता हूँ:

  1. एक यादृच्छिक संख्या उत्पन्न करें, या कम से कम एक संख्या के लिए एक यादृच्छिक हिस्सा है, और एक केंद्रीय डेटाबेस में संग्रहीत। फिर जांच के लिए सभी गेट सिस्टम में डेटाबेस डाउनलोड करें।
  2. संख्या को आत्मनिर्भर होना आवश्यक है। दूसरे शब्दों में, संख्या को सहेजी गई सूची के बिना जांचने में सक्षम होना चाहिए। यह किसी प्रकार की चेकसम प्रणाली की तरह लगता है। उदाहरण के लिए, आप 1 से ऊपर की संख्या जारी कर सकते हैं, उन्हें 5 अंक (00000-99999 = 100,000 नंबर) बना सकते हैं, और 1-3 अक्षरों को प्रीपेन्डे कर सकते हैं, यह सुनिश्चित कर लें कि आप चेकसम के साथ समाप्त हो जाएं जो जांच करेगा।
+0

कोई समस्या नहीं है। 1 यह है कि मैं लाइन से काम करने में सक्षम होना चाहिए, और टिकट कुछ ही मिनट पहले ऑनलाइन खरीदा जा सकता था, इसलिए मेरे पास टिकट डीबी का अद्यतित संस्करण कभी नहीं हो सकता था। अब 2 के लिए, आप पिछले टिकट से एक टिकट कोड पर्याप्त रूप से अलग कैसे करेंगे? – Jaime

0

ऑफ़लाइन सत्यापन के लिए, मैं केवल एक आसान उपाय .. टिकट आईडी

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

यह आपको टिकट आईडी के आकार को सीमित करने और टिकट आईडी के आकार के संबंध में स्पष्ट रूप से आनुपातिक सुरक्षा की अनुमति देता है।

+0

मैं यही सोच रहा हूं, लेकिन यह कितना मान्य है (विविधता और हैंश की संख्या के मामले में) एमडी 5 हैश कहने का केवल एक हिस्सा उपयोग करना है? – Jaime

+0

यदि यह एक क्रिप्टोग्राफ़िक रूप से सुरक्षित हैश (यहां तक ​​कि इस तथ्य को छूट देना कि एमडी 5 टूटा गया है), हैश के हिस्से का उपयोग करके विविधता और हैश की संख्या में अपेक्षित/आनुपातिक कमी प्रदान की जानी चाहिए। उदाहरण के लिए, 128 बिट्स से 32 बिट्स तक हैश आकार को कम करने के लिए (चाहे आप 32 बिट्स चुनते हैं), आप 2^128 से 2^32 तक संभावित हैंश की संख्या कम कर सकते हैं। एक क्रूर बल के हमले की जटिलता या आकस्मिक टकराव की संभावना को आनुपातिक रूप से आसान बना दिया जाता है। – chuck

0

आप सीआरसी गणना कर सकते हैं।

असल में, स्ट्रिंग में प्रत्येक वर्ण को जोड़ना शुरू करें, और लंबाई को एक लंबे पूर्णांक तक सीमित करें।

आप एक ज्ञात यादृच्छिक संख्या से शुरू कर सकते हैं और इसे पहले 4 बाइट्स में स्टोर कर सकते हैं, और आखिरी चार गणनाएं जैसा कि मैंने पहले वर्णित किया था।

यह दो इंच या आठ बाइट्स होगा।

0

यहाँ एक योजना आपको पहले आ चुके से अगले टिकट हैश की गणना (ताकि आप सत्यापित कर सकते हैं एक याद आ रही है या नहीं) का लाभ दिया है कि है, लेकिन नहीं करता बाहरी लोगों के लिए अगले एक गणना:

Ticket.0 = substring(HASH(SALT + IV  ), 0, LENGTH) 
Ticket.i = substring(HASH(SALT + Ticket.i-1), 0, LENGTH) 

जहां

  • HASH किसी भी हैशिंग समारोह है कि उत्पादन स्ट्रिंग
  • SALT भर में अपेक्षाकृत समान रूप से अपनी एन्ट्रापी वितरित करता है एक स्थिर है आप secre रखने टी; यह एक अच्छा विचार है प्रत्येक घटना
  • IV है एक और लगातार आप को गुप्त रखने के लिए एक अलग से एक का उपयोग करने के लिए
  • लंबाई अपने प्रश्न में टिकट आईडी आप चाहते हैं (10 की लंबाई है, लेकिन 12 सवाल से बाहर नहीं है और आपको 256 गुना टिकट आईडी देता है)
+0

यदि कंप्यूटर डाउन है तो सत्यापित नहीं किया जा सकता है। या क्या आप स्क्रैच से टिकट नंबर तक दरवाजे पर कंप्यूटर का सुझाव दे रहे हैं? – jmucchiello

+0

मुझे जो समस्या दिखाई देती है वह यह है कि दरवाजा पर कंप्यूटर सत्यापित नहीं कर सकता है कि दिया गया टिकट मान्य है, क्योंकि इसमें स्थानीय रूप से सभी टिकट नहीं हैं। या क्या मैं कुछ न कुछ भूल रहा हूं? – Jaime

+0

मुझे लगता है कि किसी भी समाधान में सभी जेनरेट किए गए टिकटों के डेटाबेस की स्थानीय प्रतिलिपि होनी चाहिए। इस समाधान का लाभ यह है कि आप 4-टुपल से डेटाबेस ऑफ़लाइन उत्पन्न कर सकते हैं। और यदि संख्याOfTicketsSold में परिवर्तन (बी/सी कोई शो से 7 मिनट पहले ऑनलाइन खरीदता है), तो डेटाबेस में अधिक मूल्य जोड़ना आसान है। फिर भी 4-टुपल के बिना गणना करना मुश्किल है। –

11

पहिया को फिर से क्यों शुरू करें? बस कुछ इस तरह करते हैं (पायथन कोड, मुझसे पूछें यदि आप स्पष्टीकरण की जरूरत है):

import hashlib 

secretpassword = "blah" 

def createticket(eventnum, ticketnum): 
    m = hashlib.md5() # or any crypto hash you like 
    m.update("%s%s%s" % (eventnum, ticketnum, secretpassword)) 
    return m.hexdigest()[:10] 

उदाहरण:

घटना संख्या 1

टिकट संख्या 123

createticket(1,123) 
# output: 2d7f242597 

श्री ticketman आता है उसके सत्यापनकर्ता के साथ और घटना/टिकट संख्या में प्रवेश करता है और हैश:

def verifier(eventnum, ticketnum, hash): 
    return hash == createticket(eventnum, ticketnum) 

verifier(1,123, "2d7f242597") 
# ouput: True 
+0

शायद मुझे यह अधिकार नहीं मिल रहा है, लेकिन एक पूर्ण हैश (एएलए एमडी 5) के साथ मेरी समस्या यह है कि मेरे पास सत्यापन के लिए टिकट नंबर नहीं है, इसलिए मैं इसके खिलाफ सत्यापित करने के लिए हैश नहीं बना सकता। यह एक अलग सवाल हो सकता है, हैश के पहले एक्स अंकों का उपयोग करना कितना वैध है? – Jaime

+4

@jaimedp, यही कारण है कि जब आप टिकट प्रिंट करते हैं, तो आप हैश के साथ इवेंट नंबर और टिकट नंबर शामिल करते हैं। यह हैश के पहले एक्स अंकों का उपयोग करने के लिए पूरी तरह से मान्य है क्योंकि सभी अच्छे क्रिप्टोग्राफिक हैंश को सभी अंकों (हिमस्खलन प्रभाव) में एन्ट्रॉपी वितरित करना चाहिए। – Unknown

+0

@jaimedp, जब भी आप बारकोड प्रिंट करते हैं, तो पहले कुछ पदों के रूप में ईवेंट नंबर और टिकट नंबर को एन्कोड करें। आपके पास जानकारी न रखने का कोई कारण नहीं है। असल में, यह समाधान व्यावहारिक रूप से वही है जैसा आपने स्वीकार किया है सिवाय इसके कि आपको अपने स्वयं के ब्लॉक साइफर के साथ मिलना है। – Unknown

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