2009-07-23 16 views
6

के साथ हस्ताक्षर एन्कोडिंग मुझे ec2 एपीआई के संस्करण 2 हस्ताक्षर के लिए हैश एन्कोडिंग में समस्या है।अमेज़ॅन ec2 एपीआई संस्करण 2 सी #

नोट मेरी संस्करण 1 हस्ताक्षर हैशिंग ठीक काम करता है, लेकिन यह मूल्यह्रास हुआ है और मैं संस्करण 2 तो सबसे पहले यहाँ पर ले जाने की आवश्यकता होगी कोड है कि काम करता है ...

मापदंडों सिर्फ एक शब्दकोश, है कि मैं क्या करना है बस पैरामीटर को कुंजी से सॉर्ट करें और प्रत्येक मान-जोड़ी को बिना किसी डिलीमीटर के संलग्न करें, फिर हैश जो मेरी कुंजी के विरुद्ध स्ट्रिंग है। (फिर से, ध्यान दें कि यह ठीक काम करता है)

private string GetVersion1Sig() 
{ 
    string sig = string.Join(string.Empty, parameters.OrderBy(vp => vp.Key).Select(p => string.Format("{0}{1}", p.Key, p.Value)).ToArray()); 
    UTF8Encoding encoding = new UTF8Encoding(); 
    HMACSHA256 signature = new HMACSHA256(encoding.GetBytes(_secretAccessKey)); 
    byte[] hash = signature.ComputeHash(encoding.GetBytes(sig)); 
    string result = Convert.ToBase64String(hash); 
    return result; 
} 

अब, संस्करण 2 के साथ वहाँ कुछ परिवर्तन कर रहे हैं, यहाँ API डेवलपर को गाइड से doco है ...

  1. canonicalized क्वेरी स्ट्रिंग बनाएं कि आप बाद में इस प्रक्रिया में आवश्यकता है:

ए। प्राकृतिक बाइट ऑर्डरिंग के साथ पैरामीटर नाम से यूटीएफ -8 क्वेरी स्ट्रिंग घटकों को सॉर्ट करें। पैरामीटर जीईटी यूआरआई या पोस्ट बॉडी से आ सकते हैं (जब सामग्री-प्रकार एप्लिकेशन/एक्स-www-form-urlencoded है)।

बी। URL निम्नलिखित नियमों के अनुसार पैरामीटर नाम और मानों को एन्कोड करता है:

• आरएफसी 3986 परिभाषित किए गए किसी भी अनारक्षित वर्णों को यूआरएल एन्कोड न करें। ये अनारक्षित पात्र ए-जेड, ए-जेड, 0-9, हाइफ़न (-), अंडरस्कोर (_), अवधि (।), और tilde (~) हैं।
• प्रतिशत% XY के साथ अन्य सभी अक्षरों को एन्कोड करें, जहां एक्स और वाई हेक्स वर्ण 0-9 और अपरकेस ए-एफ हैं।
• फॉर्म% XY% ZA में प्रतिशत यूटीएफ -8 वर्णों को बढ़ाया गया है ....
• प्रतिशत स्पेस वर्ण को% 20 (और + नहीं, सामान्य एन्कोडिंग योजनाओं के रूप में) को एन्कोड करें।

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

सी। एन्कोडेड पैरामीटर नामों को उनके एन्कोडेड मानों से बराबर चिह्न (=) (ASCII वर्ण 61) के साथ अलग करें, भले ही पैरामीटर मान खाली हो।

डी। एम्पर्सेंड के साथ नाम-मूल्य जोड़े को अलग करें() (ASCII कोड 38)।

  1. निम्नलिखित छद्म-व्याकरण ("\ n" ASCII न्यूलाइन का प्रतिनिधित्व करता है) के अनुसार हस्ताक्षर करने के लिए स्ट्रिंग बनाएं। StringToSign = HTTPVerb + "\ n" + ValueOfHostHeaderInLowercase + "\ n" + HTTPRequestURI + "\ n" +
    CanonicalizedQueryString HTTPRequestURI घटक अप करने के लिए HTTP यूआरआई की निरपेक्ष पथ घटक है, लेकिन सहित नहीं , क्वेरी स्ट्रिंग। यदि HTTPRequestURI खाली है, तो आगे स्लैश (/) का उपयोग करें।
  2. आपके द्वारा बनाई गई स्ट्रिंग के साथ एक आरएफसी 2104-अनुरूप एचएमएसी की गणना करें, कुंजी के रूप में आपकी गुप्त पहुंच कुंजी , और SHA256 या SHA1 हैश एल्गोरिदम के रूप में। अधिक जानकारी के लिए, http://www.rfc.net/rfc2104.html पर जाएं।
  3. परिणामस्वरूप मान को बेस 64 में कनवर्ट करें।
  4. परिणामस्वरूप मान का उपयोग हस्ताक्षर अनुरोध पैरामीटर के मान के रूप में करें।

तो मैं क्या है .... है

private string GetSignature() 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("GET\n"); 
    sb.Append("ec2.amazonaws.com\n"); 
    sb.Append("/\n"); 
    sb.Append(string.Join("&", parameters.OrderBy(vp => vp.Key, new CanonicalizedDictCompare()).Select(p => string.Format("{0}={1}", HttpUtility.UrlEncode(p.Key), HttpUtility.UrlEncode(p.Value))).ToArray())); 
    UTF8Encoding encoding = new UTF8Encoding(); 
    HMACSHA256 signature = new HMACSHA256(encoding.GetBytes(_secretAccessKey)); 
    byte[] hash = signature.ComputeHash(encoding.GetBytes(sb.ToString())); 
    string result = Convert.ToBase64String(hash); 
    return result; 
} 

पूर्णता यहाँ जहाँ तक IComparer कार्यान्वयन ....

internal class CanonicalizedDictCompare : IComparer<string> 
    { 
    #region IComparer<string> Members 

    public int Compare(string x, string y) 
    { 
     return string.CompareOrdinal(x, y); 
    } 

    #endregion 
    } 

है मैं बता सकता हूँ के रूप में मैं सब कुछ किया है मुझे इस हैश के लिए करने की ज़रूरत है, लेकिन मुझे सर्वर से एक त्रुटि मिल रही है जो मुझे बता रही है कि मेरा हस्ताक्षर गलत है। सहायता ...

+1

उपर्युक्त उदाहरण में कक्षा में सिस्टम का उपयोग कर होगा। सुरक्षा। क्रिप्टोग्राफी; इसके अलावा, अमेज़ॅन के इस वर्णन के बारे में विवरण (हैश की गणना करने से कम) के लिए http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html – adinas

उत्तर

7

ठीक है, मैंने इसे समझ लिया .... HttpUtility क्लास में UrlEncoding अमेज़ॅन एन्कोडिंग योजना के अनुरूप नहीं है .... grrr (विशेष रूप से .NET उपयोगिता में% के बाद हेक्स मान लोअरकेस है, अपरकेस नहीं)

बी। यूआरएल निम्नलिखित नियमों के अनुसार पैरामीटर नाम और मूल्यों सांकेतिक शब्दों में बदलना:

  • नहीं यूआरएल एनकोड अनारक्षित अक्षर हैं जो RFC 3986 परिभाषित करता है के किसी भी। इन अनारक्षित पात्र ए-जेड, ए-जेड, 0-9, हाइफ़न (-), अंडरस्कोर (_), अवधि (।), और tilde (~) हैं।
  • % XY, जहां एक्स और वाई वर्ण 0-9 और अपरकेस A-F हेक्स कर रहे हैं के साथ

    प्रतिशत एनकोड सभी अन्य पात्रों ।

  • प्रतिशत एनकोड UTF-8 प्रपत्र% XY% ZA में पात्रों ....

  • प्रतिशत एनकोड अंतरिक्ष चरित्र बढ़ाया% के रूप में 20 (और नहीं +, आम एन्कोडिंग योजनाओं करते हैं)।

तो इस योजना को एन्कोड करने वाली त्वरित विधि लिखने के बाद, यह ठीक काम करता है।

+0

इसके लिए चीयर्स देखें। मुझे काम करने में मदद मिली। हालांकि मैंने पाया कि मुझे अभी भी हाइफ़न (कम से कम) एन्कोड करने की आवश्यकता है। इसमें खोजशब्द खोज के साथ हाइफ़न करना एक "अमान्य हस्ताक्षर" त्रुटि उत्पन्न करता है। मैंने अभी तक अन्य विशेष पात्रों का परीक्षण नहीं किया है .. – Dermot

+0

क्या आप इस विधि के लिए कोड साझा कर सकते हैं? मैं वास्तव में इसकी सराहना करता हूं। –

+0

@AlirezaNoori दुर्भाग्यवश मुझे इसके पास अब तक पहुंच नहीं है। मैं उस कंपनी से आगे बढ़ गया हूं जहां मैंने ऐसा किया था। अगर मुझे याद है, तो ऐसा करना मुश्किल नहीं था, अगर आप परावर्तक या आईएल/जासूस का उपयोग करते हैं तो आप देख सकते हैं कि एचटीपीटीटीटी क्लास में यह कैसे किया जाता है और हेक्स वर्णों को बस अपरकेस करता है। –

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