2009-11-14 11 views
8

Estoy tratando de probar la API desde ankoder.com y tengo problemas en el cálculo de resumen para el authentication token. La muestra es ruby ​​mientras intento llamar desde C#. Cuando comparo el resultado del resumen en HMAC-SHA1, tengo problemas con el resultado de la clave maestra.hmac-sha1 en ruby ​​difiere de C# HMACSHA1

Para que sea más fácil de probar aquí está el código:

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 

Lo que me da el resultado: "X/0EngsTYf7L8e7LvoihTMLetlM = \ n" Si intento esto en C# con lo siguiente:

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

el resultado sal es el mismo, pero el resultado clave de paso se diferente- C# me da:

QLC68XjQlEBurwbVwr7euUfHW/k =

Tanto genera la sal: f5cab5092f9271d43d2e

Cualquier buena idea de lo que ha sucedido?

Respuesta

10

Has puesto PrivateKey y salt en las posiciones incorrectas en tu código C#; según su código Ruby, PrivateKey debe ser la clave secreta de HMAC.

También tenga en cuenta que ha incluido una nueva línea al final del hash producido por su programa Ruby (de acuerdo con la salida de muestra, de todos modos). Debe no incluir la nueva línea o los valores hash no coincidirán.

Este programa C# corrige el primer número:

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

Solo me pregunto, ¿qué resultado obtienes con esto? – quantumpotato

+0

X/0EngsTYf7L8e7LvoihTMLetlM = –

3

veo 2 números,

  1. ¿Usted consiguió clave/datos invertidos. En Ruby, private_key es la clave y la sal es la información. En C#, hiciste lo contrario.
  2. Si no se permite ASCII en cualquiera de sus cadenas, debe asegurarse de utilizar la misma codificación. Ruby trata todo como bytes sin formato, por lo que C# tiene que coincidir con su codificación. Si se usa jcode, la codificación en C# debe coincidir con $ KCODE.
Cuestiones relacionadas