У меня есть следующий фрагмент кода для создания сигнатуры HMACSHA1 на C#. Какой следующий кодГенерировать HMACSHA1 в ruby
Encoding encoding = new UTF8Encoding();
HMACSHA1 hmac = new HMACSHA1(encoding.GetBytes(SecretKey.ToCharArray()));
StringBuilder data = new StringBuilder();
data.Append(Access);
data.Append(Id);
data.Append(Entity);
data.Append(Username);
string signature Convert.ToBase64String(hmac.ComputeHash(encoding.GetBytes(data.ToString().ToCharArray())));
Теперь я хочу перевести, что рубин, что-то вроде:
Base64.encode64(OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new('sha1'), secret_key, data)
Однако, результат не равен для того же входа. Используют ли они разные алгоритмы хеширования?
Благодаря
HMAC SHA1 при скармливании те же байты для сообщения и тайна всегда должна производить такой же хеш. Различные языки и библиотеки * должны * реализовать точно такой же алгоритм. Что такое кодировка символа ключа и данных, которые у вас есть в версии Ruby (используйте, например, 'puts secret_key.encoding', чтобы проверить)? Кроме того, по предположению вы кодируете 'hexdigest' в Ruby, но вызываете' ComputeHash' в C# - если последний выводит необработанные байты, то два вызова не эквивалентны. –
Правильно, в этом была проблема. На рубине я использовал hexdigest, который не был тем, что C# использовал точно – Pablo