2011-08-12 14 views
6

से अलग मुझे एंड्रॉइड पर कुछ एचएमएसी के साथ समस्याएं हैं। मैं निम्नलिखित कोड के साथ SHA1 एल्गोरिदम का उपयोग कर रहा हूं जो एंड्रॉइड एचएमएसी-शाए 1 के लिए खोज करते समय पूरे वेब पर दिखाई देता है।एंड्रॉइड एचएमएसी-एसएचए 1 मानक जावा एचएमएसी-एसएचए 1

 String base_string = "This is a test string"; 
     String key = "testKey"; 
     try { 
      Mac mac = Mac.getInstance("HmacSHA1"); 
      SecretKeySpec secret = new SecretKeySpec(key.getBytes("UTF-8"), mac.getAlgorithm()); 
      mac.init(secret); 
      byte[] digest = mac.doFinal(base_string.getBytes()); 

      String enc = new String(digest); 

      // Base 64 Encode the results 
      String retVal = Base64.encodeBase64String(enc.getBytes()); 
      Log.v(TAG, "String: " + base_string); 
      Log.v(TAG, "key: " + key); 
      Log.v(TAG, "result: " + retVal); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 

इस कोड को परीक्षण करने के लिए मैं एक साधारण मानक जावा इसके साथ (Log.v की जगह निश्चित रूप से System.out.println कॉल के साथ कॉल) कार्यक्रम तो मैं बनाम Android संस्करण की तुलना कर सकते बनाया। दोनों उदाहरणों में मैं base_string और कुंजी के लिए एक ही परीक्षण मान का उपयोग कर रहा हूं।

इसके अतिरिक्त मैंने मानक जावा से एन्कोड किए गए परिणामों को कुछ PHP फ़ंक्शन और सत्यापन सर्वर (कुछ ओथ टोकन का उपयोग करके) सत्यापित किया है। कोड मानक जावा प्रोग्राम में ठीक काम करता है हालांकि यह एंड्रॉइड प्रोग्राम में काम नहीं करता है। मैंने बहुत सी खोज की है और यह पता नहीं लगा कि क्या गलत है। किसी ने कभी इसका अनुभव किया है?

यहां मानक जावा और एंड्रॉयड के परिणाम हैं ...

  • जावा (और PHP): fH/+pz0J5XcPZH/d608zGSn7FKA=
  • एंड्रॉयड कार्यक्रम: fH/vv73vv709Ce+/vXcPZH/vv73vv71PMxkp77+9FO+/vQ==

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

किसी भी मदद की सराहना की जाती है!

+1

विधि नहीं ढूंढ सकता 'android.util.Base64.encodeBase64String (...) ' –

उत्तर

13

मुझे लगता है कि यह एक स्ट्रिंग एन्कोडिंग समस्या है।

आप यहाँ क्या कर रहे हैं?

 String enc = new String(digest); 

     // Base 64 Encode the results 
     String retVal = Base64.encodeBase64String(enc.getBytes()); 

आप बाइट्स एक स्ट्रिंग में वापस एक बाइट सरणी के लिए फिर से चालू करें, और तब (जो आप तो आधार -64 एनकोड)।

इसके बजाय, इस कार्य करें:

 String retVal = Base64.encodeBase64String(digest); 

सामान्य में, कभी उपयोगकर्ता String.getBytes() या new String(byte[]) यदि आप एक पोर्टेबल कार्यक्रम चाहते हैं। और एक स्ट्रिंग (बेस 64 जैसी चीज़ के अलावा) में एक मनमानी बाइट एरे (जो पहले एक स्ट्रिंग नहीं था) को परिवर्तित करने का प्रयास न करें।

+0

वाह! बहुत आसन! मुझे पता था कि यह ऐसा कुछ होने वाला था लेकिन मैं वास्तव में अपने सिर को खरोंच कर रहा था। धन्यवाद! इसने तुरंत समस्या को ठीक किया। – nlbers

+0

+1 एक महान उत्तर के लिए :) –

+1

आपको विधि encodeBase64String() कहां मिलती है? मुझे इसे कहीं भी नहीं मिला। – Gabrielle

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