2010-02-26 16 views
7

मैं लॉगिन करते समय किसी के पासवर्ड को सत्यापित करने कोशिश कर रहा हूँ वापसी नहीं करता है।2 बराबर बाइट [] सच

मेरे द्वारा डाला पासवर्ड लेने के लिए और पुनः प्राप्त उन टुकड़ों में बांटा पासवर्ड और पासवर्ड नमक बचा लिया।

फिर मैंने सहेजे गए नमक के साथ दर्ज पासवर्ड हैश यह देखने के लिए है कि यह सहेजे गए पासवर्ड के बराबर है या नहीं।

हालांकि, बाइट [] संग्रहीत पासवर्ड बिल्कुल बाइट [] दर्ज किया गया है, पासवर्ड में, यह एक बूल में सच नहीं होता है और इसलिए उपयोगकर्ता को सत्यापित नहीं करता है। ऐसा क्यों है?

public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword, byte[] storedSalt) 
    { 
     byte[] password = CreateHashedPassword(newPassword, storedSalt); 

     if (!password.Equals(storedPassword)) 
      return false; 

     return true; 
    } 

उत्तर

3

बराबर दो बाइट [] सरणी की तुलना नहीं करता है। आपको प्रत्येक बाइट को दो सरणी में तुलना करना होगा।

2

आपको एक सरणी के तत्वों पर पुनरावृत्ति करना है ताकि यह देखने के लिए कि वे समान हैं या नहीं। .Equals() विधि का उपयोग केवल आपको बताता है कि क्या दो चर समान सरणी का संदर्भ देते हैं।

 for (int i = 0; i < password.Length; i++) 
      if (password[i] != storedPassword[i]) 
       return false; 
     return true; 
+0

, मैं पासवर्ड और storedPassword की लंबाई की तुलना होगा:

आप की तरह कुछ की जरूरत है। यदि संग्रहीत पासवर्ड पासवर्ड से छोटा है तो आप सरणी के अंत से पहले पढ़ सकते हैं। फ्लिप पक्ष पर, यदि पासवर्ड छोटा है, तो यह केवल पहले कुछ बाइट्स की तुलना कर रहा है। यदि आप पासवर्ड को कम आकार के लिए प्राप्त कर सकते हैं, तो संग्रहीत पासवर्ड के उपसर्ग के साथ मिलान करना संभव हो सकता है। जैकब – TheJacobTaylor

+0

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

13

आप अपने सरणियों के प्रत्येक बाइट की तुलना करनी चाहिए, आप एक सरल पाश बना सकते हैं, या SequenceEqual Linq एक्सटेंशन विधि यदि उपलब्ध का उपयोग करें:

public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword, 
            byte[] storedSalt) 
{ 
    byte[] password = CreateHashedPassword(newPassword, storedSalt); 

    return password.SequenceEqual(storedPassword); 
} 
0

System.Array.Equals विधि का परीक्षण करने के लिए प्रकट होता है ऑब्जेक्ट पहचान के लिए, केवल ऑब्जेक्ट की तरह। एक्वाल्स।

आपको एक लूप लिखना है और तत्वों की तुलना करना है।

0

ऐरे। एक्वाल्स ऑब्जेक्ट की तरह है। एक्वाल्स, यह उदाहरण के समानता के लिए परीक्षण करता है, न कि "मूल्य" समानता के लिए। इस कोड से पहले

public static boolean ByteArrayEquals(byte[] a, byte[] b) { 
    if (a.Length != b.Length) 
    return false; 
    for (int i = 0; i < a.Length; i++) 
    { 
     if (a[i] != b[i]) 
     return false; 
    } 
    return true; 
} 
संबंधित मुद्दे