2012-04-03 29 views
6

का हेक्स प्रतिनिधित्व मुझे बहुत बेवकूफ लगता है, लेकिन जैसा कि मुझे जवाब नहीं पता, मैं वैसे भी आगे बढ़ रहा हूं।बाइट सरणी

मैं "मी कुछ प्रमाणीकरण कोड आज़मा रहे हैं और पता करने के लिए क्यों बाइट सरणी मैं Rfc2898DeriveBytes से प्राप्त हेक्स के लिए और वापस एक बाइट सरणी के लिए इसे सही ढंग से मेरी HMACSHA1 वस्तु आरंभ करने के लिए फिर से के लिए परिवर्तित किया जा करने की जरूरत है चाहता हूँ। मैं मैं की तरह महसूस कुछ मूर्ख कर रहा हूँ, या बस कुछ स्पष्ट याद आ रही

मेरे क्लाइंट कोड एक जावास्क्रिप्ट crypto-js के आधार पर समारोह है,।

var key256bit = Crypto.PBKDF2(passwordEntered, saltBytes, 32, { iterations: 1000 }); 
var hmacBytes = Crypto.HMAC(Crypto.SHA1, url, key256bit, { asBytes: true }); 
var base64Hash = Crypto.util.bytesToBase64(hmacBytes); 

मेरे सर्वर साइड कोड इस प्रकार है के रूप में,

Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, 
               encoding.GetBytes(salt), 1000); 
    byte[] key = rfc2898.GetBytes(32); 

    // Don't think I should need to do this. 
    // However, it wont work if I initialise HMACSHA1 
    // with the rfc2898.GetBytes(32) 
    string test = ByteArrayToString(key); 

    HMACSHA1 hmacSha1 = new HMACSHA1(encoding.GetBytes(test)); 

    byte[] computedHash = hmacSha1.ComputeHash(encoding.GetBytes(requestUri)); 
    string computedHashString = Convert.ToBase64String(computedHash); 

मेरी बाइटएरे टॉस्ट्रिंग विधि जिसे मैंने वेब से पकड़ा है;

private static string ByteArrayToString(byte[] ba) 
{ 
    StringBuilder hex = new StringBuilder(ba.Length * 2); 
    foreach (byte b in ba) 
     hex.AppendFormat("{0:x2}", b); 
    return hex.ToString(); 
} 

तो मैं देख सकता हूँ कि मैं rfc2898.GetBytes(32) करने के लिए अपने कॉल से 32 बाइट्स मिलता है। मैंने यह पुष्टि करने के लिए बाइटएरेरे टॉस्ट्रिंग विधि का उपयोग करके हेक्स में परिवर्तित किया है जो मैं अपने जावास्क्रिप्ट चर कुंजी 256 बिट में देख रहा हूं। अब मेरा टेस्ट वैरिएबल लंबाई 64 की एक स्ट्रिंग है और जब मैं एन्कोडिंग का उपयोग कर एचएमएसीएसएचए 1 के कंडक्टर को पास करता हूं। गेटबाइट्स (टेस्ट) यह लंबाई 64 का बाइट सरणी है।

क्रिप्टो-जेएस पर डॉको थोड़ा कमी है, लेकिन मैंने 32 के एक परम के साथ Crypto.PBKDF2 को कॉल किया और यह 32 बाइट लंबा (या 256 बिट्स) की कुंजी बना रहा था।

कोई स्पष्टीकरण बहुत सराहना की है।

+0

क्या भाषा (ओं) जब आप पोस्ट कोड के टुकड़े का उपयोग कर रहे निर्दिष्ट करें। यह तुरंत स्पष्ट नहीं है कि आप सर्वर पर जावास्क्रिप्ट और जावा पर जावास्क्रिप्ट का उपयोग कर रहे हैं। मेरा मतलब है, आप मुझे पता है कि आप Dalvik या सी # का उपयोग कर सकते हैं। –

+0

@ ओल्डप्रो: यह निश्चित रूप से सी # है, जावा नहीं। "स्ट्रिंग" के आवरण को देखें, विधि नाम इत्यादि –

+0

यूप। निश्चित रूप से सी #। मैंने भाषा के संबंध में टैग नहीं जोड़े क्योंकि मेरे प्रश्न में पहले से ही 4 है! साथ ही, मुझे संदेह है कि मेरे मुद्दे का मूल कारण कोड में होने वाले रूपांतरणों की समझ की कमी है। मैं आने वाले दिनों में कुछ जांच करूंगा और वापस रिपोर्ट करूंगा। –

उत्तर

3

मुझे लगता है इस मुद्दे की जड़, PBKDF2.js में है:

return options && options.asBytes ? derivedKeyBytes : 
     options && options.asString ? Binary.bytesToString(derivedKeyBytes) : 
     util.bytesToHex(derivedKeyBytes); 

क्योंकि आप या तो asBytes या asString के लिए विकल्प प्रदान नहीं किया है, यह एक हेक्स प्रतिनिधित्व करने के लिए कुंजी परिवर्तित है - बस के रूप में अपने सी # कोड करता है तो फिलहाल आप हैं जो 512 बिट कुंजी का उपयोग कर रहे हैं, ठीक है क्योंकि आप "मूल कुंजी" के प्रत्येक बाइट से "प्रयुक्त कुंजी" के 2 बाइट उत्पन्न कर रहे हैं।

मुझे संदेह है कि यदि आप जावास्क्रिप्ट में asBytes विकल्प निर्दिष्ट करते हैं, तो यह सी # कोड में अतिरिक्त हेक्स भाग के बिना काम करेगा।

फिर, मैं कभी नहीं PBKDF2 पहले देखा है, इसलिए मैं जिस तरह से बंद आधार हो सकता है ...

+0

यह मेरे लिए सही लग रहा है। जावास्क्रिप्ट कोड में गलती के लिए जावा कोड में अजीबता। अच्छी पकड़। –

+0

@ जोन।तुम्हारे सुझाव के लिए धन्यवाद। मैं आने वाले दिनों में एक नज़र डालेगा और रिपोर्ट करूंगा। मुझे संदेह है कि आप सही हैं, बस [HMAC.js] के लिए कोड देखें (http://code.google.com/p/crypto-js/source/browse/branches/2.x/src/HMAC .js), यह स्ट्रिंग के रूप में पारित होने पर कुंजी को बाइट्स में परिवर्तित करता है। मुझे शुरुआत से करीब देखना चाहिए था। –