2011-11-29 15 views
10

मेरे पास एक वेब सेवा है और हमारे क्लाइंट को उपयोग करने की आवश्यकता वाले पैरामीटर में से एक कस्टम कुंजी है। इस कुंजीरिवर्स हैश लुकअप क्वेरी

eg: 
bce700635afccfd8690836f37e4b4e9cf46d9c08 

तो SHA1 के हैश है जब ग्राहक हमारे वेब सेवा को कॉल मैं कुछ बातों की जांच करने के लिए है:

  • सक्रिय ग्राहक
  • ग्राहक वेब सेवा और सेवा
  • के माध्यम से प्रस्तुत कर सकते हैं है

    मैं एक प्रश्न है:

अब मेरी समस्या यह है

$sql = "SELECT permission, is_active FROM clients WHERE sha1(concat(id,key)) = '" . mysql_real_escape_string($key) . "'"; 

क्या मैं सही काम कर रहा हूं? या एक बेहतर तरीका है? धन्यवाद

+0

आप मूल रूप से एक सत्र आईडी के रूप में कुंजी का उपयोग कर रहे हैं? यदि ऐसा है, तो आप PHP सत्रों का उपयोग करने के बजाय विचार कर सकते हैं। बहुत आसान और सुरक्षित। http://php.net/manual/en/features.sessions.php –

+0

@ जोनाथन एम नहीं, कुंजी क्लाइंट आईडी + यादृच्छिक कुंजी का एक sha1 है (हम स्थानीय रूप से तालिका में स्टोर करते हैं) और हम ग्राहक को देते हैं। इसलिए जब हम अपनी साइट पर कॉल करते हैं तो उसे इसका उपयोग करने की आवश्यकता होती है जैसे: http://ws.domain.com/bce700635afccfd8690836f37e4b4e9cf46d9c08/ और वह उपयोगकर्ता नाम और पासवर्ड और अन्य चर पोस्ट करता है; –

+0

@ErinTucker: यदि हैश में एक यादृच्छिक कुंजी शामिल है, तो आपकी क्वेरी में अभी 'sha1 (id) 'कैसे है? – ruakh

उत्तर

10

यह दृष्टिकोण, महंगा है के बाद से, हर बार जब आप इस क्वेरी चलाने, MySQL clients में हर रिकॉर्ड की जांच करने के लिए है और गणना अपनी id और key के SHA-1 हैश होगा। (मुझे लगता है कि clients में कुछ पंक्तियों से अधिक है, या कम से कम, आप उस दृष्टिकोण का उपयोग करना चाहते हैं जो clients में कुछ पंक्तियों से अधिक है।)

क्यों नहीं आप id_key_sha1 नामक एक नया फ़ील्ड जोड़ते हैं? फ़ील्ड को पॉप्युलेट रखने के लिए आप trigger का उपयोग कर सकते हैं, और उस पर index जोड़ सकते हैं। इस दृष्टिकोण को अधिक बेहतर प्रदर्शन करना चाहिए।

जोड़ने के लिए संपादित: क्या आप इस एसएचए -1 हैश में गुजरने के अलावा क्लाइंट को उपयोगकर्ता नाम और पासवर्ड जमा करना होगा? मुझे नहीं पता कि आपकी टेबल संरचना कैसी दिखती है, लेकिन मुझे लगता है कि उपयोगकर्ता नाम के आधार पर क्लाइंट रिकॉर्ड को और अधिक समझने के लिए और फिर उस विशिष्ट रिकॉर्ड के लिए SHA-1 हैश की तुलना करने की कोशिश करने के बजाय, और अधिक समझदारी होगी एसएचए -1 हैश द्वारा रिकॉर्ड खोजने के लिए।

+0

क्षमा करें मैं कुछ भूल गया .. मैंने अपना प्रश्न –

+0

@ErinTucker अपडेट किया: मैंने तदनुसार अपना जवाब अपडेट कर दिया है। – ruakh

+0

आपके उत्तर के लिए धन्यवाद, मुझे यह विचार पसंद है –

0

आपको अपने एलएचएस कॉलम में फ़ंक्शन लागू नहीं करना चाहिए, जहां MySQL,
में फ़िल्टरिंग करना संभव है, यह तुलना के लिए इंडेक्स का उपयोग करने के लिए mysql के लिए संभव नहीं है।

एक उदाहरण सूचकांक पर मेकअप उपयोग की अनुमति देगा: -

where key = SHA1(CONCAT(id, :key)) 

// where the :key = user submitted api key 
// and in this case mysql able to fetch the matched rows via index 
संबंधित मुद्दे