2009-11-14 2 views
8

ankoder.com에서 API를 테스트하고 authentication token의 다이제스트 계산에 문제가 있습니다. 내가 C#에서 전화하려고하는 동안 샘플은 루비입니다. HMAC-SHA1에서 다이제스트 결과를 비교할 때 암호 키 결과에 문제가 있습니다.ruby의 hmac-sha1이 C# 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 

나에게 결과를 제공합니다 :

여기 테스트하기 쉽도록하는 코드입니다 "X/0EngsTYf7L8e7LvoihTMLetlM = \ n" 나는 다음과 C#에서 이것을 시도하는 경우 :

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- C 번호 내게 제공된다

QLC68XjQlEBurwbVwr7euUfHW/K =

0,123,516을

두 가지 모두 소금을 생성합니다. f5cab5092f9271d43d2e

좋은 아이디어 무슨 일이 일어 났습니까?

답변

10

PrivateKeysalt을 C# 코드의 잘못된 위치에 넣었습니다. 루비 코드 당 PrivateKey은 HMAC의 비밀 키를 의미합니다.

Ruby 프로그램에서 생성 된 해시 끝 부분에 새 라인을 포함했음을 유의하십시오 (어쨌든 샘플 출력에 따라). 이 아니고에 개행 문자가 포함되어 있거나 해시가 일치하지 않아야합니다.

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

X/0EngsTYf7L8e7LvoihTMLetlM = –

3

난 당신이 반전 키/데이터를 가지고

  1. 이 문제를 참조하십시오

    이 C# 프로그램

    는 첫 번째 문제를 해결합니다. Ruby에서 private_key가 키이고 salt가 데이터입니다. C#에서는 그 반대였습니다.
  2. 문자열에 ASCII가 아닌 값이 허용되면 동일한 인코딩을 사용해야합니다. Ruby는 모든 것을 원시 바이트로 취급하므로 C#은 해당 인코딩과 일치해야합니다. jcode를 사용하면 C#의 인코딩이 $ KCODE와 일치해야합니다.