2011-08-24 20 views
5

Çalıştığım üçüncü parti bir hizmet için hızlı bir şekilde bir buggy .Net istemci kitaplığı almaya çalışıyorum. Orijinal kitaplık (hangi eserler) Ruby'de yazılmıştır, ancak DotNet için eşdeğer kütüphaneleri Ruby kütüphanesine farklı karma çıkışlar üretir. aşağıdaki gibiHMC SHA1 hash - C# Ruby'den daha farklı karma çıkışı üretiyor

Ruby şifreleme kodudur:

def self.encrypt_string(input_string) 
    raise Recurly::ConfigurationError.new("Recurly gem not configured") unless Recurly.private_key.present? 
    digest_key = ::Digest::SHA1.digest(Recurly.private_key) 
    sha1_hash = ::OpenSSL::Digest::Digest.new("sha1") 
    ::OpenSSL::HMAC.hexdigest(sha1_hash, digest_key, input_string.to_s) 
end 

(sözde) eşdeğer C# kodudur:

private static string ComputePrivateHash(string dataToProtect) 
{ 
    if(String.IsNullOrEmpty(Configuration.RecurlySection.Current.PrivateKey)) 
     throw new RecurlyException("A Private Key must be configured to use the Recurly Transparent Post API."); 

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

    HMACSHA1 hmac_sha1 = new HMACSHA1(Encoding.ASCII.GetBytes(Configuration.RecurlySection.Current.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); 

    return BitConverter.ToString(passkey_binary).Replace("-", "").ToLower(); 
} 

gerçek karma çıkış Aynı giriş ve özel anahtar verilen da farklılık gösterir. Yanlış karma çıkış üretmesine neden olan C# yöntemiyle ilgili sorun nedir? Aşağıda

Teşekkür Henning cevabı

private static string ComputePrivateHash(string dataToProtect) 
{ 
    if(String.IsNullOrEmpty(Configuration.RecurlySection.Current.PrivateKey)) 
     throw new RecurlyException("A Private Key must be configured to use the Recurly Transparent Post API."); 

    var privateKey = Configuration.RecurlySection.Current.PrivateKey; 
    var hashedData = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(dataToProtect)); 
    var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(privateKey)); 
    var hash = hmac.ComputeHash(hashedData); 
    return BitConverter.ToString(hash).Replace("-", "").ToLower(); 
} 

DOĞRU CEVAP: hala yanlış çıktı üretir olsa

DÜZENLEME
Bu, kodu yazılı olurdu yolu olduğunu Doğru kodun doğru olduğunu belirledim:

var privateKey = Configuration.RecurlySection.Current.PrivateKey; 
var hashedKey = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(privateKey)); 
var hmac = new HMACSHA1(hashedKey); 
var hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(dataToProtect)); 
return BitConverter.ToString(hash).Replace("-", "").ToLower(); 
+0

Belki de http://stackoverflow.com/questions/3393790/how-to-do-it-in-ruby-on-rails yardımcı olabilir? –

+1

Düşünüyorsunuz, ama nope :( –

+0

Sorunu kendiniz ayıklamak için ne yaptınız? En azından bekleyeceğiniz şey, HMAC ilkeline ait ikili girişlerin aynı olup olmadığını araştırmanızdır. C# sürümünüz Ruby kodunuzda bulunmayan hex-encoding ve substring extraction ile bazı garip şeyler yapmak.Ayrıca Ruby versiyonunun arkasından tüm bunları yaptıklarından emin misiniz? –

cevap

4

Kodu anlarsam, Ruby kodunun anahtarını anahtarını HMAC'ye göndermeden önce ayrı olarak göründüğü (HMAC'ın gerektiğinde uzun bir tuşa sahip olduğundan, kriptografik olarak gerekmediği), ve orijinal mesajla birlikte HMAC'a hashed anahtarı.

Öte yandan

, C# kodu orijinal anahtar ve mesajın bir karma bir HMAC hesaplar. böylece farklı bir şekilde

Ben Ruby ve C# kütüphaneleri HMAC tedavi olacağını hayal bile edemiyorum (içerik tuz ne de bir anahtar ne olsa Açıklanamaz, sen karma mesajı saklamak değişkenler ... salt ve private_key_binary denir) Yapılması gereken doğru şey bu.

+0

Mükemmel, haklısın, doğru okuduğum şeyi yorumlamıyordum. Konuştuğunuz için teşekkürler; Sorumu doğru cevabı içerecek şekilde güncelledim. –