2009-11-14 17 views
8

से अलग है मैं ankoder.com से एपीआई का परीक्षण करने की कोशिश कर रहा हूं और authentication token के लिए पाचन गणना पर समस्या है। नमूना रूबी है जबकि मैं सी # से कॉल करने की कोशिश कर रहा हूं। जब मैं एचएमएसी-एसएचए 1 में पाचन परिणाम की तुलना करता हूं, तो मुझे पासकी परिणाम के साथ समस्याएं मिलती हैं।रूबी में hmac-sha1 सी # HMACSHA1

require 'hmac-sha1' 
require 'digest/sha1' 
require 'base64' 
token="-Sat, 14 Nov 2009 09:47:53 GMT-GET-/video.xml-" 
private_key="whatever" 
salt=Digest::SHA1.hexdigest(token)[0..19] 
passkey=Base64.encode64(HMAC::SHA1.digest(private_key, salt)).strip 

कौन सा मुझे परिणाम देता है:

इसे यहाँ परीक्षण करने के लिए आसान बनाने के लिए कोड है "एक्स/0EngsTYf7L8e7LvoihTMLetlM = \ n" अगर मैं निम्नलिखित के साथ सी # में इस प्रयास करें:

const string PrivateKey = "whatever"; 

var date = "Sat, 14 Nov 2009 09:47:53 GMT";//DateTime.Now.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss") + " GMT"; 
string token=string.Format("-{0}-GET-/video.xml-", date); 

var salt_binary=SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(token)); 
var salt_hex=BitConverter.ToString(salt_binary).Replace("-", "").ToLower(); 
var salt =salt_hex.Substring(0,20); 

var hmac_sha1 = 
      new HMACSHA1(Encoding.ASCII.GetBytes(salt)); 
hmac_sha1.Initialize(); 

var private_key_binary = Encoding.ASCII.GetBytes(PrivateKey); 
var passkey_binary = hmac_sha1.ComputeHash(private_key_binary,0,private_key_binary.Length); 

var passkey = Convert.ToBase64String(passkey_binary).Trim(); 

नमक परिणाम ही है, लेकिन पासकी परिणाम different- सी # मुझे देता है:

QLC68XjQlEBurwbVwr7euUfHW/k =

0,123,

दोनों नमक उत्पन्न करते हैं: f5cab5092f9271d43d2e

कोई अच्छा विचार क्या हुआ है?

उत्तर

10

आपने अपने सी # कोड में गलत स्थिति में PrivateKey और salt डाल दिया है; आपके रूबी कोड के अनुसार, PrivateKey एचएमएसी की गुप्त कुंजी होने के लिए है।

यह भी ध्यान रखें कि आपने अपने रूबी प्रोग्राम द्वारा उत्पादित हैश के अंत में एक नई लाइन शामिल की है (वैसे भी आपके नमूना आउटपुट के अनुसार)। आपको में न्यूलाइन या हैश शामिल नहीं होंगे।

using System; 
using System.Security.Cryptography; 
using System.Text; 

namespace Hasher 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     const string PrivateKey = "whatever"; 

     string date = "Sat, 14 Nov 2009 09:47:53 GMT"; 
     string token = string.Format("-{0}-GET-/video.xml-", date); 

     byte[] salt_binary = SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(token)); 
     string salt_hex = BitConverter.ToString(salt_binary).Replace("-", "").ToLower(); 
     string salt = salt_hex.Substring(0, 20); 

     HMACSHA1 hmac_sha1 = new HMACSHA1(Encoding.ASCII.GetBytes(PrivateKey)); 
     hmac_sha1.Initialize(); 

     byte[] private_key_binary = Encoding.ASCII.GetBytes(salt); 
     byte[] passkey_binary = hmac_sha1.ComputeHash(private_key_binary, 0, private_key_binary.Length); 

     string passkey = Convert.ToBase64String(passkey_binary).Trim(); 
    } 
    } 
} 
+0

बस सोच रहा है, आप इसके साथ क्या परिणाम प्राप्त करते हैं? – quantumpotato

+0

एक्स/0EngsTYf7L8e7LvoihTMLetlM = –

3

2 मुद्दों,

  1. आप कुंजी/डेटा उलट मिला देखें:

    यह सी # कार्यक्रम पहले यह समस्या ठीक होती। रूबी में, private_key कुंजी है और नमक डेटा है। सी # में, आपने विपरीत किया था।

  2. यदि आपके किसी भी स्ट्रिंग में गैर-ASCII की अनुमति है, तो आपको यह सुनिश्चित करना होगा कि आप एक ही एन्कोडिंग का उपयोग करें। रूबी कच्चे बाइट्स के रूप में सब कुछ मानता है ताकि सी # को अपने एन्कोडिंग से मेल खाना पड़े। यदि जेकोड का उपयोग किया जाता है, तो सी # में एन्कोडिंग $ KCODE से मेल खाना चाहिए।
संबंधित मुद्दे