Ç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();
Belki de http://stackoverflow.com/questions/3393790/how-to-do-it-in-ruby-on-rails yardımcı olabilir? –
Düşünüyorsunuz, ama nope :( –
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? –