2010-04-07 22 views
5

में अद्वितीय टेक्स्ट फ़ील्ड मैंने उपयोग करके नमक बनाया है; md5 (रैंड (0,10000000)); (शायद एक बेहतर तरीका है?)MySQL और php

MYSQL में एक टेक्स्ट फ़ील्ड अद्वितीय बनाने के लिए संभव नहीं लगता है। तो मैं कैसे जांच करूं कि पिछले उपयोगकर्ता के लिए नमक का उपयोग पहले से ही किया जा रहा है या नहीं?

या मुझे वर्तमान दिनांक/समय के आधार पर नमक उत्पन्न करना चाहिए? क्योंकि 2 उपयोगकर्ताओं के लिए एक ही समय में सही पंजीकरण करना असंभव है?

+1

आप वर्चर फ़ील्ड पर एक अनूठी बाधा जोड़ सकते हैं - आप डुप्लिकेट लवण की जांच के लिए इसका उपयोग कर सकते हैं। – thetaiko

उत्तर

1

नमक के लिए, विशिष्टता लंबाई और भविष्यवाणी से अधिक महत्वपूर्ण है। आप मानते हैं कि हमलावर का नमक है।

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

एमडी 5 के साथ समय को धक्का देना अद्वितीय मान उत्पन्न करने के लिए एक आम तरीका है क्योंकि इसकी निश्चित लंबाई है और मानव पठनीय है। हालांकि, यह एक निश्चित लंबाई यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए और अधिक समझ में आता है और इसे स्वयं हेक्स में एन्कोड करता है। हैश को विशिष्टता के लिए डिज़ाइन नहीं किया गया है क्योंकि उन्हें डिज़ाइन नहीं किया जा सकता है। एक हैशिंग फ़ंक्शन का उपयोग टकराव की गारंटी देता है, हालांकि एमडी 5 की तुलना में SHA1 के साथ कम टक्कर होगी।

नमक की लंबाई वास्तव में केवल एक कारक है क्योंकि लंबे समय तक नमक, अधिक संभावना है कि यह सार्वभौमिक रूप से अद्वितीय हो।

+0

कुछ सनकी संयोग होना चाहिए 2 उपयोगकर्ता जो एक ही नमक के पास एक ही पासवर्ड रखने का निर्णय लेते हैं, तो –

+0

@ जोनाथन, यदि अलग-अलग पासवर्ड डाइजेस्ट्स के साथ डुप्लिकेट लवण हैं, तो मैं उन खातों पर पहले हमला करूँगा क्योंकि यह मुझे एक बेहतर मौका देता है एक सफल टकराव खोजने पर। एक ही नमक और पासवर्ड वाले दो खाते हमलावर को एक की कीमत के लिए दो देंगे, लेकिन हमलावर को कोई ब्रेक नहीं मिलता है। –

0

md5() एक टूटा हुआ एल्गोरिदम है और इसे कभी भी छुआ नहीं जाना चाहिए।

रैंड() थोड़ा टूटा हुआ है क्योंकि यह सिस्टम घड़ी पर आधारित है।

एक बेहतर तरीका है:

function generateRandomKey() 
{ 
    return base_convert(uniqid(mt_rand(), true), 16, 36); 
} 

संपादित करें: अगर वहाँ एक बेहतर तरीका है या मैं गलत हूँ, कृपया मुझे यह करने का अपना रास्ता दिखाते हैं। मैं वास्तव में दिलचस्पी रखता हूं, और जानना चाहता हूं कि मैं असुरक्षित हूं या नहीं।

+1

एक और अधिक व्यापक रूप से स्वीकृत दृश्य देखने के लिए http://stackoverflow.com/questions/2329609/is-it-safe-to-store-passwords-hashed-with-md5cryptoserviceprovider-in-c – dkretz

+0

@ledorifier, आपके द्वारा पोस्ट किया गया लिंक है हैशिंग पासवर्ड के बारे में, यादृच्छिक लवण उत्पन्न नहीं। –

+1

और http://stackoverflow.com/questions/157998/whats-the-difference-between-sha-and-md5-in-php। मैं इसका जिक्र कर रहा था "... कभी छूना नहीं।" – dkretz

0

आप UUID उत्पन्न करने के लिए http://php.net/manual/en/function.uniqid.php जैसे कुछ का उपयोग कर सकते हैं। या टाइमस्टैम्प भी एक अच्छा है - शायद टाइमस्टैम्प और आईपी पता या इसी तरह के।

0

उपयोगकर्ता आईडी और डेटाटाइम का उपयोग कर SHA1 के साथ नमक उत्पन्न करें।

1

MySQL की अनुक्रमणिका टेक्स्ट फ़ील्ड पर सीमित-सीमित हैं, वे पूरे क्षेत्र को स्वचालित रूप से चार/वर्कर फ़ील्ड पर नहीं करते हैं, इसलिए टेक्स्ट फ़ील्ड पर 'अद्वितीय' कुंजी का उपयोग करने का कोई व्यावहारिक तरीका नहीं है।

लेकिन तुम MySQL द्वारा उत्पन्न हैश भंडारण कर रहे हैं, तो आप पाठ की जरूरत नहीं है - है परिणाम, सादे-पाठ कर रहे हैं तो बस एक निश्चित लंबाई चार क्षेत्र का उपयोग करें:

mysql> select length(md5('a')), length(sha1('a')); 
+------------------+-------------------+ 
| length(md5('a')) | length(sha1('a')) | 
+------------------+-------------------+ 
|    32 |    40 | 
+------------------+-------------------+ 

और उसके बाद आप उस क्षेत्र में एक अनूठी बाधा लागू कर सकते हैं।

0

आप आमतौर पर नमक तार उत्पन्न नहीं करते हैं। तो जब आप उन्हें पहली बार उत्पन्न करते हैं, तो आपको एक अच्छी नौकरी करनी चाहिए। लंबे और अधिक यादृच्छिक तार बेहतर हैं।नया पासवर्ड

update user set salt = :salt, password = sha1(concat(:password, :salt)) where id = :id limit 1; 

के लिए

function generateSalt($length = null) 
{ 
    if (!is_int($length) || ($length < 1)) $length = 250; 
    do { 
    $salt[] = chr(mt_rand(0, 255)); 
    } while (--$length); 
    return implode('', $salt); 
} 

अद्यतन क्वेरी आप जाँच लें कि पासवर्ड सही है और एक ही समय में उपयोगकर्ता डेटा प्राप्त कर सकते हैं।

select * from user where id = :id and password = sha1(concat(:password, salt)) limit 1;