2011-09-16 11 views
10

में HmacSHA256 हस्ताक्षर उत्पन्न करना मैं अपने संदेश को अमेज़ॅन एडब्ल्यूएस (जुनीट टेस्ट के अंदर) पर हस्ताक्षर करने की कोशिश कर रहा हूं, लेकिन मुझे एक समस्या आई। यहाँ कोड मैं का उपयोग कर रहा है:जुनीट

String secretAccessKey = "secret1234678901";   
SecretKeySpec keySpec = new SecretKeySpec(secretAccessKey.getBytes(UTF-8), "HmacSHA256"); 
Mac mac = Mac.getInstance(this.MAC_ALGO); 
mac.init(keySpec); // here it breaks 
byte[] encoded = mac.doFinal(
    request.toString().getBytes(this.CHARSET)); 
return Base64.encodeBase64URLSafeString(encoded); 

लाइन में चिह्नित (mac.init(...)) जावा फेंकता अपवाद:

java.lang.ClassCastException: com.sun.crypto.provider.HmacSHA1 cannot be cast to javax.crypto.MacSpi 
    at javax.crypto.Mac.a(DashoA13*..) 
    at javax.crypto.Mac.init(DashoA13*..) 

क्या आप जानते हैं कि ऐसा क्यों होता है? नेट कोड पर मैंने जो भी कोड देखा है, वह लगभग इसी तरह दिखता है, मैंने उसी परिणाम के साथ एचएमएसीएसए 1 के साथ भी कोशिश की।

+1

यह अपवाद बताता है कि आपकी जावा कॉन्फ़िगरेशन बहुत गलत है। क्या आप शायद जावा क्लासपाथ में jce.jar के अपने संस्करण में मिश्रण कर रहे हैं? आधुनिक जावा में पहले से ही सभी क्रिप्टो पुस्तकालयों का निर्माण किया गया है। –

+0

बस एक नोट: आपके द्वारा पोस्ट किया गया कोड संकलित नहीं होता है, और यदि आप इसे संकलित करने के लिए परिवर्तन करते हैं, तो यह कभी भी यह त्रुटि संदेश नहीं देगा (आप "HmacSHA256" निर्दिष्ट करते हैं, लेकिन त्रुटि संदेश "HmacSHA1" कहता है)। मुझे लगता है कि एक विन्यास त्रुटि, जैसे ग्रेग ने कहा, हालांकि। –

उत्तर

34

क्षमा करें मैंने सब कुछ नहीं जोड़ा। उपरोक्त कोड जूनिट और पावरमेकिटो का उपयोग करके परीक्षण किया गया था। लेकिन पावरमॉकिटो javax.crypto कक्षाओं को बढ़ा नहीं सकता है इसलिए मुझे जूनिट में @PowerMockIgnore("javax.crypto.*") जोड़ना पड़ा।

+0

PowerMock और java.crypto का उपयोग करते समय मुझे एक ही समस्या हो रही थी। अनदेखा जोड़ना मेरे लिए समस्या तय करता है। – XORshift

+0

मेरे लिए भी काम करता है। धन्यवाद :) – Ajit

+0

1000 इस उत्तर को पसंद है, मेरे दिन को बचाया। – Samiron