2010-07-17 17 views
10

के साथ मेरे हैंश को सट्टेबाजी करना अधिकांश उपयोगकर्ताओं की तरह, मैं बस पासवर्ड स्टोर करने के लिए एक सुरक्षित तरीका जानने का प्रयास कर रहा हूं। जो मुझे यहां नहीं मिला है (या शायद यह मेरी समझ की कमी है) है कि मेरे डेटाबेस में नमकीन हैश को कैसे प्राप्त किया जाए और नमक को पासवर्ड बनाए रखने के दौरान प्रत्येक पासवर्ड के लिए अद्वितीय लवण के साथ विशेष रूप से से नमक को अलग करें। एक कॉलम मेंPHP और MySQL

मुझे पासवर्ड एन्क्रिप्ट करने के लिए इन सभी शानदार तरीकों को ढूंढ रहा है (SHA-256, लेकिन MySQL केवल SHA/1 और MD5 का समर्थन करता है?) और PHP मैनुअल से अन्य चीजें, लेकिन यह सुनिश्चित नहीं है कि पासवर्ड कैसे स्टोर और पुनर्प्राप्त करें।

तो, अब तक यह सब है मैं समझता हूँ:

SHA('$salt'.'$password') // My query sends the password and salt 
         // (Should the $salt be a hash itself?) 

मैं लवण के साथ खो रहा हूँ उसके बाद।

नमक के बिना पासवर्ड पुनर्प्राप्त करना आसान है, लेकिन नमक मुझे भ्रमित करता है। मुझे फिर से नमक से मूल्य कहां मिल सकता है, खासकर यदि यह अद्वितीय और सुरक्षित है? क्या मैं उन्हें किसी अन्य डेटाबेस में छुपाता हूं? निरंतर (असुरक्षित लगता है)?

संपादित करें: क्या एचएमएसी में मुख्य चर नमक होना चाहिए या यह कुछ और है?

+0

Fwiw, MySQL 5.5 एसएसएल समर्थन के साथ बनाया एक 'SHA2 भी शामिल है () 'समारोह जो SHA224, SHA256, SHA384, और SHA512 हैश एल्गोरिदम प्रदान करता है। यदि आप MySQL के पुराने संस्करण का उपयोग कर रहे हैं, तो PHP में 'हैश()' फ़ंक्शन का उपयोग करें। –

+0

फिर से धन्यवाद, बिल, यह दूसरी बार है जब आपने मदद की है! मैं 5.1 का उपयोग कर रहा हूं क्योंकि यह WAMP (wampserver.com) के साथ आया था। मुझे इसे स्थापित करने के लिए अपने पुराने MySQL को अनइंस्टॉल करना पड़ा। दुर्भाग्यवश, मुझे यकीन नहीं है कि इसे कैसे अपडेट किया जाए ... मैं अपने एन्क्रिप्शन के लिए PHP का उपयोग करने का प्रयास करूंगा। – Tarik

उत्तर

5

पहले, अपने डीबीएमएस (MySQL) क्रिप्टोग्राफिक हैश के लिए किसी भी समर्थन की आवश्यकता नहीं है। आप इसे सब कुछ PHP पक्ष पर कर सकते हैं, और यह भी आपको क्या करना चाहिए।

यदि आप उसी कॉलम में नमक और हैश स्टोर करना चाहते हैं तो आपको उन्हें संयोजित करने की आवश्यकता है।

// the plaintext password 
$password = (string) $_GET['password']; 

// you'll want better RNG in reality 
// make sure number is 4 chars long 
$salt = str_pad((string) rand(1, 1000), 4, '0', STR_PAD_LEFT); 

// you may want to use more measures here too 
// concatenate hash with salt 
$user_password = sha512($password . $salt) . $salt; 

अब, आप एक पासवर्ड तुम क्या सत्यापित करने के लिए चाहते हैं:

// the plaintext password 
$password = (string) $_GET['password']; 

// the hash from the db 
$user_password = $row['user_password']; 

// extract the salt 
// just cut off the last 4 chars 
$salt = substr($user_password, -4); 
$hash = substr($user_password, 0, -4); 

// verify 
if (sha512($password . $salt) == $hash) { 
    echo 'match'; 
} 

आप phpass पर एक नज़र लेने के लिए है, जो भी इस तकनीक का उपयोग करता है चाहते हो सकता है। यह एक PHP हैशिंग समाधान है जो कुछ अन्य चीजों के बीच नमक का उपयोग करता है।

आपको निश्चित रूप से प्रश्न WolfOdrade से जुड़े प्रश्न का उत्तर देखना चाहिए।

+0

धन्यवाद! बहुत सारे नए काम, लेकिन मैं खुद को नटदार किरदार समझ सकता हूं। यही वह है जिसकी तलाश में मैं हूं। मैं subtract स्ट्रिंग सुविधा के बारे में कभी नहीं जानता था, जो मदद करता है। क्या विभिन्न नमक प्लेसमेंट के लिए एक स्ट्रिंग के सामने से घटाना संभव है? एक बार फिर धन्यवाद! – Tarik

+0

निश्चित रूप से, सबस्ट्रेट दोनों को संभाल सकता है। यदि आपके सामने मोर्चे पर 4 वर्ण नमक हैं तो आप करेंगे: '$ salt = substr ($ user_password, 0, 4); $ हैश = सबस्ट्र ($ user_password, 4); ' – igorw

+0

धन्यवाद। मैंने hash_hmac की कोशिश की, लेकिन मुझे डेटाबेस पासवर्ड के साथ लॉगिन पासवर्ड की तुलना में परेशानी हो रही है। Hash_hmac में नमक यादृच्छिक रूप से जेनरेट किया गया है, तो मैं इसे कैसे घटा सकता हूं? मैंने आपके उदाहरण में भी यही बात देखी है। sha512 ($ पासवर्ड। $ नमक) पासवर्ड हैशिंग और एक अद्वितीय नमक है। डेटाबेस पास के साथ दर्ज पासवर्ड हैश को उस अद्वितीय नमक को वापस कैसे प्राप्त किया जाएगा? प्रश्न अधिभार के लिए खेद है, मैं बस इससे दूर इंच हूँ! – Tarik

3

यह एक पिछली पोस्ट में में गहराई से शामिल किया गया लगता है: सभी की Secure hash and salt for PHP passwords

+0

मैंने यह प्रश्न बनाने से पहले इसके लिए सबसे अच्छा जवाब पढ़ा और उसने मेरे प्रश्न का उत्तर नहीं दिया। यह पासवर्ड को सुरक्षित रूप से स्टोर करने का एक अच्छा तरीका प्रदान करता है, लेकिन यह वही नहीं है जो मैं ढूंढ रहा हूं। – Tarik

0

व्यक्तिगत रूप से मैं अपने अंतर्निहित कार्यों के साथ MySQL को ऐसा करने की सलाह देता हूं।

वे जिस तरह से करते हैं मैं अपनी डेटाबेस कॉन्फ़िगरेशन फ़ाइल में एक फ़ंक्शन बनाने के लिए करता हूं जो एक कुंजी स्ट्रिंग देता है। कॉन्फ़िगरेशन फ़ाइल आपकी साइट रूट के बाहर होनी चाहिए ताकि वेबसर्वर फ़ाइल तक पहुंच सके लेकिन दूसरों को नहीं। तो उदाहरण के लिए:

function enc_key(){ 
    return "aXfDs0DgssATa023GSEpxV"; 
} 

तो अपनी स्क्रिप्ट में इसे इस तरह एसक्यूएल क्वेरी और MySQL में AES_ENCRYPT और AES_DECRYPT कार्यों के साथ उपयोग करें:

require_once('dbconf.inc.php'); 

$key = enc_key(); 

//When creating a new user 
$sql = "INSERT INTO users (username, password) VALUES ('bob', AES_ENCRYPT('{$key}', {$password}))"; 

//When retrieving users password 
$sql = "SELECT AES_DECRYPT('{$key}', password) AS password FROM users WHERE username like 'bob'"; 
+0

यह वास्तव में एक अच्छा विचार नहीं है। आपको पासवर्ड एन्क्रिप्ट नहीं करना चाहिए, आपको उन्हें हैश करना चाहिए (अगर कोई आपके सर्वर को हैक करता है तो उसे आपके सभी उपयोगकर्ताओं के पासवर्ड तक पूर्ण पहुंच होगी)। आप भागने की अनुपस्थिति के माध्यम से एसक्यूएल इंजेक्शन भी लगा रहे हैं। – igorw

+0

सबसे पहले, मैं पुन: आकार देता हूं कि स्ट्रिंग इंजेक्शन के लिए खुले हैं; हालांकि यह चर्चा का विषय नहीं था। एसक्यूएल स्टेटमेंट केवल उदाहरण हैं और मुझे लगता है कि उन्हें अपने उपयोगकर्ता इनपुट को स्वच्छ करने की आवश्यकता का एहसास है। मैं उनके लिए आवेदन लिखने के लिए यहां नहीं हूं मैं विशिष्ट प्रश्नों के उत्तर देने के लिए यहां हूं। –

+0

दूसरा, 2 रास्ता एन्क्रिप्शन उतना सुरक्षित है जितना कि "हैशिंग" जब तक आप कुंजी को सुरक्षित रखते हैं। मुझे एहसास है कि अगर कोई आपके सर्वर को हैक करता है तो उनके पास उनके पासवर्ड हैं लेकिन यदि कोई आपके सर्वर को हैक करता है तो उनके पास डेटाबेस में जानकारी के हर दूसरे हिस्से सहित सबकुछ तक पहुंच है, इसलिए हैशिंग पासवर्ड प्रकार एक महत्वपूर्ण बिंदु बन जाता है, आपको नहीं लगता? –