2012-04-03 34 views
6

Bunu sorduğumda oldukça aptalım, ama cevabı bilmediğim için yine de devam ediyorum.Bayt dizisinin HEX gösterimi

Bazı kimlik doğrulama kodlarını deniyorum ve neden RTP2898DeriveBytes öğesinden aldığım bayt dizisinin, HMACSHA1 nesnesini doğru bir şekilde yeniden başlatmak için tekrar bir bayt dizisine dönüştürülmesi gerektiğini bilmek istiyorum. saçma bir şey yapıyor, ya da sadece belirgin bir şey eksik

Müvekkilim kodu crypto-js dayalı bir javascript fonksiyonudur;.

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); 

My Sunucu tarafında kod aşağıdaki gibidir;

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); 

Web'den aldığım ByteArrayToString yöntemim;

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(); 
} 

Ben de rfc2898.GetBytes(32) benim çağrısından 32 bayt olsun görebilirsiniz. Ben bunu Javascript değişkeni key256bit'imde gördüğümle eşleştiğini doğrulamak için bunu ByteArrayToString yöntemini kullanarak HEX'e dönüştürdüm. Ben encoding.GetBytes (testi) kullanılarak HMACSHA1 en constuctor için bu kripto-js üzerinde doco biraz eksik 64.

uzunlukta bir bayt dizisi olduğunu geçtiğinde Şimdi benim test değişken, uzunluk 64 dizesidir ve ancak Crypto.PBKDF2'ye 32'lik bir param ile çağrı yaptım ve 32 byte uzun (veya 256 bit) bir anahtar oluşturuyordum.

Herhangi bir açıklama çok takdir edilmektedir.

+0

...

Sonra tekrar, daha önce PBKDF2 görmedim, o yüzden yoldasın olabilir. Sunucuda istemcide ve Java'da JavaScript kullandığınız hemen belli değil. Demek istediğim, bildiğim her şey için Dalvik veya C# kullanıyor olabilirsiniz. –

+0

@OldPro: Bu kesinlikle C# değil, Java değil. "Dize", yöntem adları vb. Kasasına bakın. –

+0

Yup. Kesinlikle C# Zaten 4 içeren soru olarak dil ile ilgili etiket eklemedim! Ayrıca, sorunumun temel nedeninin, kodda devam eden dönüşümleri anlamadaki eksikliğim olduğundan şüpheleniyorum. Önümüzdeki günlerde biraz araştırma yapacağım ve rapor vereceğim. –

cevap

3

Bu PBKDF2.js meselenin kökü, şüpheli: Eğer asBytes veya asString ya seçenekleri sağlamadığınızdan, bir altıgen temsil anahtarı çeviriyor

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

- Sadece C# olarak kod yok. Bu nedenle, 512 bit anahtar kullanarak, , tam olarak "orijinal anahtar" her bayttan "kullanılan anahtar" ın 2 baytını oluşturduğunuz için.

Javascript'te asBytes seçeneğini belirtirseniz, C# kodunda fazladan onaltılık bölüm olmadan çalışacağından şüpheleniyorum. Ne dil (ler) kod parçacıkları yayımlayan kullanmakta olduğunuz belirtin

+0

Bu bana doğru görünüyor. JavaScript kodunda hata yapmak için Java kodundaki gariplik. İyi yakalama. –

+0

@Jon.Önerin için teşekkürler. Önümüzdeki günlere bir göz atacağım ve rapor vereceğim. Yine de, haklı olduğunuzu şüpheliyim, [HMAC.js] için sadece şu adresten bir göz atın (http://code.google.com/p/crypto-js/source/browse/branches/2.x/src/HMAC .js), bir dize olarak geçirilirse, anahtarı baytlara dönüştürür. Başından beri daha yakından bakmalıydım. –