2009-11-14 14 views
8

Ich versuche, die API von ankoder.com zu testen und Problem bei der Digest-Berechnung für die authentication token. Das Beispiel ist Ruby, während ich versuche, von C# anzurufen. Wenn ich das Digest-Ergebnis zwischen HMAC-SHA1 vergleiche, habe ich Probleme mit dem Passkey-Ergebnis.hmac-sha1 in Ruby unterscheidet sich von C# HMACSHA1

es einfach zu machen, hier zu testen, ist der Code:

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 

Welche mir das Ergebnis gibt: "X/0EngsTYf7L8e7LvoihTMLetlM = \ n" Wenn ich versuche, dies in C# mit dem folgenden:

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

das Salz Ergebnis ist das gleiche, aber die passkey Ergebnis ist anders- C# gibt mir:

QLC68XjQlEBurwbVwr7euUfHW/k =

Beide erzeugen das Salz: f5cab5092f9271d43d2e

Haben Sie eine gute Idee, was passiert ist?

Antwort

10

Sie haben PrivateKey und salt an den falschen Positionen in Ihrem C# -Code platziert; pro Ruby-Code ist PrivateKey der geheime Schlüssel des HMAC.

Beachten Sie auch, dass Sie am Ende des von Ihrem Ruby-Programm erzeugten Hashes einen Zeilenumbruch eingefügt haben (entsprechend Ihrer Beispielausgabe). Sie müssen nicht enthalten die Zeilenumbruch oder die Hashes nicht übereinstimmen.

Das C# Programm korrigiert die erste Ausgabe:

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

Nur wundernd, welches Ergebnis erhalten Sie damit? – quantumpotato

+0

X/0EngsTYf7L8e7LvoihTMLetlM = –

3

Ich sehe 2 Ausgaben,

  1. Sie Schlüssel/Daten rückgängig gemacht habe. In Ruby ist private_key der Schlüssel und das Salz die Daten. In C# haben Sie das Gegenteil gemacht.
  2. Wenn Nicht-ASCII in einem Ihrer Strings zulässig ist, müssen Sie sicherstellen, dass Sie die gleiche Codierung verwenden. Ruby behandelt alles als rohe Bytes, so dass das C# mit seiner Codierung übereinstimmen muss. Wenn jcode verwendet wird, sollte die Codierung in C# mit $ KCODE übereinstimmen.
Verwandte Themen