hmac-sha1 в рубине отличается от C# HMACSHA1

На основе моего собственного опыта с ним я не рекомендовал бы мерзавцу как введение в управление версиями. Я использовал его в течение нескольких месяцев теперь, и мое впечатление - то, что это очень мощно и - теперь, когда я частично получил голову вокруг этого - довольно интуитивный. Однако кривая обучения очень крута, даже при том, что я использовал управление версиями в течение многих лет. Это также страдает от того, чтобы быть слишком выразительным - это поддерживает много различных рабочих процессов и моделей разработки, но единственное руководство на "лучшем" способе использовать его несколько страниц глубиной в поиске Google, который также делает его коварным для вновь прибывшего для взятия.

Однако возможно, что запуск с пустого большого списка с мерзавцем мог бы на самом деле быть легче - мой опыт VCS - все с централизованным управлением версиями (CVS, SVN, По необходимости...) и часть моего (продолжающийся!) трудность с мерзавцем понимала последствия распределенной модели. Я действительно глядел кратко на другой DVCSes как Базар и Подвижный, и они, казалось, были несколько более благоприятными для новичка.

Так или иначе, как другие сказали, Подрывная деятельность является, вероятно, самым легким способом привыкнуть к мышлению управления версиями и получить практический опыт преимуществ VCS (откат, ответвления, совместная разработка, более легкий обзор кода, и т.д.).

, О, и не запускаются с CVS. Это все еще находится в практическом употреблении и имеет преимущества, но по моему скромному мнению это имеет слишком много исторических причуд и проблем реализации (неатомарные фиксации!), чтобы быть хорошим способом учиться.

8
задан Ilmari Karonen 3 November 2013 в 14:59
поделиться

2 ответа

Вы поместили PrivateKey и соль в неправильные позиции в вашем коде C #; согласно вашему коду Ruby, PrivateKey должен быть секретным ключом HMAC.

Также имейте в виду, что вы включили новую строку в конец хэша, созданного вашей программой Ruby (согласно вашему образцу вывод, во всяком случае). Вы должны не включать новую строку, иначе хэши не будут совпадать.

Эта программа на C # исправляет первую проблему:

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();
    }
  }
}
10
ответ дан 5 December 2019 в 12:59
поделиться

Я вижу 2 проблемы ,

  1. У вас перевернут ключ / данные. В Ruby private_key - это ключ, а соль - это данные. В C # вы поступили наоборот.
  2. Если в любой из ваших строк разрешено использование не-ASCII, вы должны убедиться, что используете ту же кодировку. Ruby обрабатывает все как необработанные байты, поэтому код C # должен соответствовать его кодировке. Если используется jcode, кодировка в C # должна соответствовать $ KCODE.
3
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: