2010-07-06 9 views
12

मैंने एक दिलचस्प मुद्दा में भाग लिया है .. ऐसा लगता है कि "HMACSHA256" हैश के लिए ComputeHash() निश्चित रूप से व्यवहार नहीं कर रहा है .. यदि मैं हैश एल्गोरिदम का उपयोग करके हैश एल्गोरिदम के दो उदाहरण बनाते हैं। क्रिएट ("HMACSHA256") .. और चलाएं ComputeHash, मुझे दो अलग-अलग परिणाम मिलते हैं .. नीचे एक उदाहरण स्थिर वर्ग है जो इस व्यवहार को प्रदर्शित करता है।ComputeHash क्यों निश्चित रूप से कार्य नहीं कर रहा है?

internal static string HashPassword(byte[] bAll) 
{ 
    using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256")) 
    { 
     return Convert.ToBase64String(s.ComputeHash(bAll)); 
    } 
} 

मैं भी कॉल गैर स्थिर बनाने के लिए कोशिश की है (वास्तव में यह गैर स्थिर शुरू कर दिया है, और मैं डबल और ट्रिपल है और quadrudruple मेरी इनपुट सरणी .. जाँच की अपनी पूरी तरह से प्रत्येक कॉल पर एक ही .. मैं यहां तक ​​कि immidiate खिड़की की तरह में सामान किया है:

Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll) 

और दो अलग अलग हैश रिटर्न विधि में एक ब्रेकपाइंट के माध्यम से immidiates विंडो में दो बार है कि चल रहा है ..

मैं जानता हूँ कि हैश नियतात्मक होने के लिए लगता है। तो क्या देता है? चलने के साथ कुछ चल रहा है एक डीबगर में? या कोई अन्य विचार? वास्तव में इस वक्त सिर्फ दो शब्दों के लिए अजीब है :-P ..

धन्यवाद जोश

+3

क्या आपके पास कोई समस्या नहीं है जो इस समस्या को प्रदर्शित करता है? क्या कॉल के बीच या उसके दौरान 'बॉल' बदल रहा है? –

+4

एचएमएसी एक कुंजी हैश है।मुझे आपके उदाहरण कोड में कुंजी दिखाई नहीं दे रही है। मेरा मानना ​​है कि यदि आप स्पष्ट रूप से निर्दिष्ट नहीं करते हैं तो कुंजी यादृच्छिक रूप से सेट की जाती है। – dtb

+0

कॉल के बीच कुछ भी नहीं बदलता .. जैसा कि मैंने कहा है कि मैंने इसे immidiates विंडो से भी किया है .. यहां मेरी इमिडिएट्स विंडो से 4 कॉल हैं .. हाँ वे सही नहीं हैं क्योंकि आपको हैश एल्गोरिदम का निपटान करना चाहिए, लेकिन परिणाम हैं immidiates खिड़की या विधि के माध्यम से ही। (मैं उन्हें अगली टिप्पणी में शामिल करूंगा, क्योंकि मेरे पास उन्हें पेस्ट करने की प्रतिलिपि बनाने की जगह नहीं है) –

उत्तर

24

HMAC एक बंद हैश है। मुझे आपके उदाहरण कोड में कुंजी दिखाई नहीं दे रही है।

HashAlgorithm.Create("HMACSHA256") एक हैश एल्गोरिदम उदाहरण बनाता है, इसलिए यह किसी कुंजी के बारे में कुछ भी नहीं जानता है। यह शायद सिर्फ this HMACSHA256 Constructor कॉल:

public HMACSHA256()

एक अनियमित रूप से उत्पन्न कुंजी साथ HMACSHA256 वर्ग का एक नया उदाहरण आरंभीकृत।

आप this constructor हैं:

public HMACSHA256(byte[] key)

निर्दिष्ट कुंजी डेटा के साथ HMACSHA256 वर्ग का एक नया उदाहरण आरंभीकृत।

आप HMAC एल्गोरिथ्म हार्ड-कोड के लिए नहीं करना चाहते हैं, तो आप KeyedHashAlgorithm.Create का उपयोग करें और KeyedHashAlgorithm.Key संपत्ति की स्थापना करके एक विशिष्ट कुंजी आपूर्ति कर सकते हैं।

यदि आप कुंजी का उपयोग नहीं करना चाहते हैं, तो SHA256 जैसे गैर-कीड हैश का उपयोग करें।

+0

उनकी सर्वश्रेष्ठ शर्त ['KeyedHashAlgorithm.Create'] (http://msdn.microsoft.com/en-us/library/s5zz2x4d.aspx) का उपयोग करना है। सबक सीखा: अपने हैंश को जानें! – Randolpho

+0

मैं प्रदाता सामग्री में digg करने जा रहा हूं और पता लगाया कि एमएस एक कुंजी वाले हैश के लिए डिफ़ॉल्ट क्यों है/क्यों है, लेकिन हैश एल्गोरिदम। क्रिएट() का उपयोग करते समय यह जीन। यह हो सकता है कि मैं 2.0 फ्रेमवर्क के साथ 2.0 आधारित एएसपी.नेट प्रदाता स्टार्टर पैक स्रोत का उपयोग कर रहा हूं .. वैसे भी, सही दिशा में मुझे इंगित करने के लिए धन्यवाद। –

+0

@ जोश: कुछ ऐसे स्थान हैं जहां एमएस में "आश्चर्यजनक" यादृच्छिकता थी। उदाहरण के लिए, अगर आप निर्दिष्ट नहीं करते हैं तो एन्क्रिप्शन के लिए कुछ 'साइफरमोड' सेटिंग्स एक यादृच्छिक प्रारंभिक वेक्टर का उपयोग करती हैं। मजेदार हिस्सा तब होता है जब आपका एन्क्रिप्शन और डिक्रिप्शन आपके डेटा के पहले 8 बाइट्स के लिए पूरी तरह से काम करता है। मुझे लगता है कि उन्होंने यहां एक अच्छा निर्णय लिया है। मैं बल्कि एक प्रोग्राम तेजी से विफल होना चाहता हूं क्योंकि मुझे "काम करने वाले" लेकिन कम सुरक्षित स्थिति के लिए डिफ़ॉल्ट सुरक्षा मानकों की आवश्यकता नहीं है। – Brian

3

आपको HMACSHA256 के लिए एक कुंजी चाहिए। कुंजी यादृच्छिक होगी अगर यह कन्स्ट्रक्टर में पारित नहीं किया गया है।

5

बस किसी को सिरदर्द बचाने के लिए उम्मीद में यह जोड़ना।

के मामले में .NET सदस्यता प्रदाता, सुनिश्चित करें कि आपके पास अपने web.config या app.config में सेटिंग है। अन्यथा यह स्वचालित रूप से अपनी कुंजी उत्पन्न करेगा ... प्रमाणीकरण पर बकवास, और फिर अंत में आप पर हंसते हुए हंसते हैं।

संबंधित मुद्दे