2012-01-09 12 views
7

में कनवर्ट करें मेरे पास सी # में निम्न फ़ंक्शन है, एक हैशिंग फ़ंक्शन जिसे मुझे PHP में रूपांतरित करने की आवश्यकता है। मैं PHP में कुछ बातें की कोशिश की है, लेकिन मैं एक ही परिणाम नहीं मिलता है (मैं नेट के साथ अच्छा नहीं कर रहा हूँ)सी # हैशिंग फ़ंक्शन को PHP

private static string GetSignature(string args, string privatekey) 
{ 
    var encoding = new System.Text.ASCIIEncoding(); 
    byte[] key = encoding.GetBytes(privatekey); 
    var myhmacsha256 = new HMACSHA256(key); 
    byte[] hashValue = myhmacsha256.ComputeHash(encoding.GetBytes(args)); 
    string hmac64 = Convert.ToBase64String(hashValue); 
    myhmacsha256.Clear(); 
    return hmac64; 
} 

एक (गलत) PHP में प्रयास यह है:

function encode($data,$key) 
{ 
    return base64_encode(hash_hmac('sha256', $data, $key)); 
} 

उत्तर

क्या DampeS8N से नीचे सुझाव दिया गया था की एक मामूली बदलाव मेरे लिए काम किया।

function encode($data,$key) 
{ 
    iconv_set_encoding("input_encoding", "ASCII"); 
    iconv_set_encoding("internal_encoding", "ASCII"); 
    iconv_set_encoding("output_encoding", "ASCII"); 

    return base64_encode(hash_hmac('sha256', $data, $key, true)); 
} 

कृपया यह भी नहीं hash_hmac के चौथे पैरामीटर - अब बाइनरी डेटा

+0

यदि आपको सही दिशा में इंगित किया गया है तो आपको DampeS8Ns उत्तर स्वीकार करना चाहिए। – jgauffin

उत्तर

6

के रूप में कच्चे उत्पादन के लिए सही पर सेट मैं अपने .net कोड के पहले लाइन पर शक दोषी है। PHP has no encoding for the string स्वयं और इसलिए जब यह हैश का समय आता है तो यह आंतरिक PHP स्ट्रिंग प्रारूप के बाइट्स को नुकसान पहुंचा रहा है (संभावना है, कोई और पुष्टि कर सकता है?) या संभावना से अधिक कुछ और पहले परिवर्तित हो रहा है। इस मामले में शायद यूनिकोड जो निश्चित रूप से वही बाइट्स नहीं है कि स्ट्रिंग ASCII के रूप में होगी .net अनुरोध कर रहा है।

मेरी सलाह यह सुनिश्चित करना होगा कि PHP इंटरऑपरेबिलिटी की अनुमति देने के लिए ASCII, with iconv का भी उपयोग कर रहा है।

function encode($data,$key) 
{ 
    return base64_encode(hash_hmac('sha256', iconv(iconv_get_encoding("internal_encoding"), "ASCII", $data), iconv(iconv_get_encoding("internal_encoding"), "ASCII", $key))); 
} 

मुझे यकीन है कि इसके बाद के संस्करण कोड उत्पादन वांछित हैश, हालांकि, मैं प्रारंभिक कोड का परीक्षण करने के .net आसान नहीं है के रूप में नहीं हो सकता है। लेकिन यह आपको सही दिशा में इंगित कर सकता है।

यदि यह काम नहीं करता है, तो iconv_get_encoding( के अंदर मूल्य अपराधी हो सकता है, "output_encoding" या "input_encoding" भी आजमाएं। यह भी संभव है कि आपको इन मानों को ASCII को iconv_set_encoding( के साथ सेट करने की आवश्यकता होगी।

शुभकामनाएं!


अद्यतन! आखिरकार यह काम करता है:

function encode($data,$key) 
{ 
    iconv_set_encoding("input_encoding", "ASCII"); 
    iconv_set_encoding("internal_encoding", "ASCII"); 
    iconv_set_encoding("output_encoding", "ASCII"); 

    return base64_encode(hash_hmac('sha256', $data, $key, true)); 
} 
+0

इसके लिए धन्यवाद। यह पूरी तरह से समझ में आता है हालांकि काम नहीं लगता है। मुझे एक ही समस्या है कि मेरे पास परीक्षण करने के लिए कोई नेट वातावरण नहीं है। मुझे यह भी लगता है कि मुझे अभी भी इस एन्कोडिंग की आवश्यकता है। गेटबाइट्स (निजीकी); – 32423hjh32423

+1

इसे केवल कुंजी के लिए ASCII के कच्चे बाइट प्राप्त करना चाहिए। PHP में गतिशील टाइपिंग की वजह से इसे प्राप्त करना और इसे नियंत्रित करना वाकई मुश्किल हो सकता है। मुझे यकीन है कि यह iconv_set_encoding के साथ सही चीजों को सेट करने का कुछ संयोजन है (यह सुनिश्चित करने के लिए कि हैश_हैमैक (आइकनव के साथ किए गए सभी कड़ी मेहनत को पूर्ववत नहीं कर रहा है (स्वयं। – DampeS8N

+0

धन्यवाद। ऊपर पोस्ट उत्तर। – 32423hjh32423

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