2010-03-03 11 views
7

को देखकर मेरे पास एक प्राथमिक कुंजी है जिसमें ऑटो वृद्धि है। मैं प्राथमिक कुंजी से जुड़ी एक छवि चाहता हूं लेकिन मैं नहीं चाहता कि प्राथमिक कुंजी प्रकट हो। छवियों का नाम कुछ इस तरह होगा:डेटाबेस आईडी के

$filename = md5($primarykey + $secret_string) . '.jpg'; 

एक अच्छा समाधान हो सकता है?

मुझे चिंता है कि टक्कर हो सकती है और एक फ़ाइल लिखी जा सकती है।

पाठ्यक्रम का दूसरा विकल्प यादृच्छिक स्ट्रिंग उत्पन्न करना है, यह जांचें कि यह फ़ाइल के रूप में मौजूद नहीं है और इसे डेटाबेस में संग्रहीत करता है ... लेकिन आईडी अतिरिक्त डेटा को स्टोर नहीं करना पसंद करता है यदि यह अनावश्यक है।

दूसरा विकल्प एक तार्किक परिवर्तन यूट्यूब यूआरएल शैली है जैसे 1 = ए 2 = बी लेकिन यादृच्छिक क्रम के साथ उदाहरण 1 = x 2 = m ... लेकिन फिर इसे डीकोड करने का मौका है ... प्लस md5 शायद किसी भी यूट्यूब यूआरएल समारोह से हल्का होगा।

मुझे लगता है कि मैं दो मिलियन से अधिक रिकॉर्ड से निपट रहा हूं तो टकराव की संभावित संभावना क्या है? आप कौन सा विकल्प चुनते हैं या आप बेहतर दृष्टिकोण के बारे में सोच सकते हैं?

+4

छवि रिकॉर्ड की प्राथमिक कुंजी की खोज होने पर क्या खतरा है? – jball

+0

यदि आईडी कॉलम प्राथमिक कुंजी है। यह आसानी से ओवरराइड नहीं किया जाएगा। आपका डीबी इसे पकड़ लेगा और आप इसे – Sinan

+0

तदनुसार महत्वपूर्ण सुरक्षा के अनुसार संभाल सकते हैं, लेकिन महत्वपूर्ण है क्योंकि यह उपयोगकर्ता को बॉट बनाने और सिस्टम को धोखा देने की अनुमति देगा – JimBo

उत्तर

0

वहाँ वास्तव में दो विकल्प है तुम हो:

  • कोई टकराव

आप आम तौर पर इन विकल्पों का उपयोग कर सकते के लिए कुछ & उत्पन्न सत्यापित करें कोई टकराव

  • कुछ उत्पन्न & आशा: - एक हैश - एक यादृच्छिक रूप से जेनरेट की गई स्ट्रिंग - एक यूयूआईडी

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

    यादृच्छिक स्ट्रिंग यह आप किसी भी चरित्र सेट या संख्याओं के किसी भी प्रकार के जेड -9 के लिए उपयुक्त किसी भी लंबाई को उत्पन्न कर सकते हैं। इसका मतलब यूआरआई, रिक्वेस्ट डेटा इत्यादि में उपयोग की जाने वाली छोटी स्ट्रिंग में "अधिक" डेटा भी है।नकारात्मकता यह है कि आपको यह जांचना है कि यह डेटाबेस में है या नहीं।

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

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

  • -1

    बस प्राथमिक कुंजी के हैश का उपयोग करें। टकराव होने की संभावना कमजोर है।

    +0

    यह आमतौर पर सही कोड लिखना अच्छा विचार नहीं है, लेकिन आप जानते हैं कि असफल हो सकता है (और पर्याप्त नमूने के साथ असफल होने की गारंटी है), खासकर जब समस्या के आसान समाधान होते हैं। – ThisGuy

    0

    यदि आप आईडी का उपयोग करना चाहते हैं, लेकिन आईडी को प्रकट नहीं करना चाहते हैं, और टकराव का कम जोखिम चाहते हैं; एक विकल्प आईडी के हैश का उपयोग करना होगा। हैश लगातार, अपरिवर्तनीय होगा, और (विशाल डेटासेट को छोड़कर - 2 हैश इस्तेमाल किए गए हैश के आधार पर) प्रत्येक फोटो के लिए अद्वितीय होगा। आप अपने प्रश्न में यह के मूल विचार है लगता है:

    $filename = md5($primarykey + $secret_string) . '.jpg'; 
    

    आप अपनी पसंद का एक hashing बेहतर एल्गोरिथ्म के लिए MD5 स्थानापन्न। एक बड़े आउटपुट के साथ अधिमानतः कुछ। टिप्पणियों के जवाब में विभिन्न प्रकार के लेखों को छोड़ने के आधार पर, ऐसा लगता है कि SHA512 या ऐसा कुछ बेहतर फिट होगा।

    +0

    "और कोई टकराव नहीं चाहते हैं; एक विकल्प आईडी के हैश का उपयोग करना होगा"। मुझे लगता है कि आपको हैश में अधिक बारीकी से देखना चाहिए। हैश टकराव का उत्पादन करते हैं। यही कारण है कि आपको उनके लिए जांच करनी है। –

    +0

    हैश को टकरा नहीं जाना चाहिए, लेकिन उनमें से कुछ SHA-0, MD4, और MD5 जैसे दिखाए गए हैं। –

    +3

    @ दाना: हैश * * टकराए जाने के लिए बहुत अधिक हैं। उनकी सबसे बुनियादी आवश्यकता एक असीमित बड़ी इनपुट स्पेस से एक सीमित आउटपुट स्पेस तक मैप करना है, और अनिवार्य रूप से टकराव का मतलब है। क्या क्रिप्टोग्राफिक हैश के पास जानबूझकर टकराव को उत्तेजित करने की विधियां नहीं होनी चाहिए। –

    2

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

    +0

    ध्यान दें कि यदि आप बेहतर सुरक्षा प्राप्त करना चाहते हैं, तो आप क्रिप्टोग्राफ़िक रूप से मजबूत यादृच्छिक संख्या के साथ एलसीजी के आउटपुट को कम कर सकते हैं। मूल रूप से $ lcg_string की तरह कुछ। $ Rand_string; इस तरह एलसीजी विशिष्टता का ख्याल रखता है और यादृच्छिक स्ट्रिंग भविष्यवाणी करना असंभव बनाता है। (हालांकि सूचित सूचित हमलावर अभी भी पीके की खोज कर सकता है) – hrnt

    0

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

    आप base64 या हेक्स एन्कोडिंग, जैसे का उपयोग कर ASCII करने के लिए एन्क्रिप्टेड डाटा कन्वर्ट करने के लिए चाहता हूँ:

    base64_encode(encrypt(id, secret_key)) 
    

    और डिकोडिंग:

    decrypt(base64_decode(id), secret_key) 
    

    (ऊपर छद्म कोड के लिए, आप है PHP में उचित फ़ंक्शंस ढूंढना है)

    आपको एन्क्रिप्शन के लिए बहुत कुछ भी पसंद नहीं है। डीईएस की तरह एक साधारण ब्लॉक सिफर पर्याप्त होगा।

    1

    आपके द्वारा प्रदान किया गया कोड नौकरी करने के लिए उपयुक्त है। आपको टकराव के बारे में चिंता करने की ज़रूरत नहीं है, आपके डेटाबेस का उपयोग करने वाले कोई पूर्णांक के परिणामस्वरूप एमडी 5 हैश किसी अन्य के रूप में नहीं होगा।

    आप वास्तव में सुनिश्चित हो करना चाहते हैं: यहाँ एक litte परीक्षण स्क्रिप्ट है,)

    <?php 
    for($i = 0; $i < 1000000; ++$i) { 
        $hash = md5($i); 
        if(isset($x[$hash])) { die("COLLISION!"); } 
        $x[$hash] = true; 
    }  } 
    echo "All is well"; 
    

    एक अधिक जटिल समाधान अपने समय की बर्बादी की तरह लगता है, लेकिन मामले में आप छोटे आईडी चाहते हैं आप दे सकते हैं प्रत्येक तस्वीर के लिए एक छोटी यादृच्छिक जेनरेट आईडी (और जांच करें कि क्या इसका उत्पादन पीढ़ी के समय पर किया गया है और यदि कोई मामला है तो उसे उत्पन्न करें)

    0

    मैं बेस 64 का उपयोग करने के बारे में सहमत हूं। आप एक ग्रिड का भी उपयोग कर सकते हैं। या बस फ़ाइल नाम को तालिका में संग्रहीत करें, जो मैंने किया है।

    अतिरिक्त में, अनाथ फ़ाइलों से बचने के लिए सावधानी बरतें।

    0

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

    आप जो चाहते हैं वह एक एन्क्रिप्शन है। Javax.crypto.Cipher पर एक नज़र डालें।

    2

    मुझे लगता है कि होगा मैं पर दो मिलियन रिकॉर्ड के साथ काम कर रहा हूँ ताकि एक टक्कर के संभावना हुड क्या है?

    Wikipedia के अनुसार, यदि आप एक 50% संभावना कम से कम एक टक्कर के लिए प्राप्त करने के लिए अधिक से अधिक 2 * 10^19 रिकॉर्ड की आवश्यकता होगी, तो मैं कहना चाहता हूँ आपको चिंता करने की जरूरत नहीं है।

    0

    यदि आप कोई कॉलम जोड़ सकते हैं, तो तालिका में UNIQUE कॉलम के रूप में एक GUID जोड़ें और <GUID>.jpg कुंजी नाम के रूप में उपयोग करें। GUID एल्गोरिदम को अचूक भविष्य में डुप्लिकेट का उत्पादन नहीं करना चाहिए, लेकिन केवल UNIQUE बाधा इसे पकड़ लेगी।

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