2010-05-31 13 views
5

में बदल मैं वर्तमान में .NET 3.5 से .NET 4.0SHA1CryptoServiceProvider .NET 4

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

ऐसा लगता है मेरी SHA1 हैश पासवर्ड नेट 4.

में अलग टुकड़ों में बांटा जा रहा है मैं SHA1CryptoServiceProvider उपयोग कर रहा हूँ:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 

2 कंसोल अनुप्रयोगों के साथ एक नया दृश्य स्टूडियो प्रोजेक्ट बनाया परीक्षण करने के लिए।
पहला .NET Framework 3.5 और दूसरा 4.0 पर लक्षित है।
मैं दोनों में एक ही हैशिंग कोड चला गया और विभिन्न परिणाम उत्पन्न किए गए।

यह क्यों हो रहा है और मैं इसे कैसे ठीक कर सकता हूं?
मैं स्पष्ट रूप से अपने सभी उपयोगकर्ताओं के पासवर्ड अपडेट नहीं कर सकता क्योंकि मुझे नहीं पता कि वे क्या हैं।

किसी भी मदद की सराहना की जाएगी। जैसे कि यह वर्ण एन्कोडिंग समस्या हो सकती है

कोड नमूना

public static class SHA1Hash 
{ 

    public static string Hash(string stringToHash) 
    { 
     return (Hash(stringToHash, Encoding.Default)); 
    } 

    public static string Hash(string stringToHash, Encoding enc) 
    { 
     byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse()); 
     var cryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 
     string hash = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)); 
     return hash; 
    } 
} 
+0

की ([लॉग इन 3.5 से ASP.net 4.0 अपग्रेड करने के बाद विफल रहता है] संभव डुप्लिकेट http://stackoverflow.com/questions/2739196/login -फेल-बाद-अपग्रेड-टू-एएसपी-नेट -4-0-से-3-5) - समाधान में –

+0

दुर्भाग्य से यह वही मामला नहीं है। यह फॉर्म्स प्रमाणीकरण कुकीज और व्यूस्टेट के संबंध में है और केवल एक समस्या है "यदि आप मिश्रित एएसपी.NET 2.0/ASP.NET 4 चलाते हैं"। लेकिन डैंग मैंने सोचा कि यह मेरा समाधान था – WebDude

+0

क्या आप AsymetricHash/हैश भ्रम को साफ़ कर सकते हैं? सुरक्षित रहने के लिए। –

उत्तर

2

टिप्पणी ने मुझे पर नेतृत्व मेरे कोड में बग खोजना।
मेरे बाइट सरणी को धोने के लिए बनाते समय, मैं स्ट्रिंग को अपने उलट संस्करण के साथ जोड़ने की कोशिश कर रहा था।

उदा। हैश करने के लिए मैं वास्तव में "passworddrowssap"

हालांकि मेरी कोड उस में एक मामूली बग है हैश होगा "पासवर्ड" दिया:

.Reverse() एक Linq विस्तार विधि है कि एक स्ट्रिंग को उल्टा कर सकते है।
हालांकि यह एक स्ट्रिंग वापस नहीं करता है, यह रिटर्न:

IEnumerable<Char> 

इस प्रकार के .ToString() कॉलिंग वास्तव में प्रस्तुत करती है:

System.Linq.Enumerable + d__99`1 [प्रणाली। चार]

4,0 रिटर्न

एस .NET में ही बात कर रहे ystem.Linq.Enumerable + d__a0`1 [System.Char]

इसलिए मेरे पासवर्ड अलग-अलग हो रहे थे।
मैं बाइट सरणी से बनाने के लिए किया जाना चाहिए क्या था:

byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray())); 
0

लग रहा है। सुनिश्चित करें कि स्ट्रिंग टुकड़ों में बांटा जा रहा है एन्कोडिंग में है [UTF8, एएनएसआई आदि] जैसा कि आप उम्मीद (और अगर ऐसा है, यह सुनिश्चित करें कि पुराने वातावरण भी है।)

-Oisin

+0

मैं एन्कोडिंग.डिफॉल्ट का उपयोग कर रहा हूं। मैं हूँ - Encoding.ASCII, Encoding.BigEndianUnicode, Encoding.Unicode, Encoding.UTF32, Encoding.UTF7, Encoding.UTF8 – WebDude

+0

हैशिंग बाइट धारा स्तर पर काम करता है: मैं एक एन्कोडिंग और निम्न में से कोई भी काम को निर्दिष्ट करने की कोशिश की यकीन नहीं है कि आप मुझे समझते हैं। आप एन्कोडिंग निर्दिष्ट कर रहे हैं कहां? यह सब मायने रखता है कि दोनों प्रणालियों को sha1 वर्ग में _bytes_ को खिलाने के लिए सत्यापित किया जाता है। – x0n

+0

कृपया कोड नमूना देखें जो मैं जिस विधि को कॉल करता हूं। दोनों साइटें एक ही सर्वर पर चल रही हैं इसलिए मुझे यकीन नहीं है कि एन्कोडिंग कहां बदल जाएगी। मैं कैसे सत्यापित कर सकता हूं कि दोनों सिस्टम sha1 वर्ग में एक ही बाइट्स खिला रहे हैं? मेरे उपरोक्त कोड नमूने के अनुसार, क्या मैं सिर्फ बफर की जांच कर सकता हूं। लम्बाई? – WebDude