2014-02-03 5 views
0

У меня есть следующий фрагмент кода для создания сигнатуры 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) 

Однако, результат не равен для того же входа. Используют ли они разные алгоритмы хеширования?

Благодаря

+0

HMAC SHA1 при скармливании те же байты для сообщения и тайна всегда должна производить такой же хеш. Различные языки и библиотеки * должны * реализовать точно такой же алгоритм. Что такое кодировка символа ключа и данных, которые у вас есть в версии Ruby (используйте, например, 'puts secret_key.encoding', чтобы проверить)? Кроме того, по предположению вы кодируете 'hexdigest' в Ruby, но вызываете' ComputeHash' в C# - если последний выводит необработанные байты, то два вызова не эквивалентны. –

+0

Правильно, в этом была проблема. На рубине я использовал hexdigest, который не был тем, что C# использовал точно – Pablo

ответ

0

Как было предложено в ответах проблема была связана с кодированием, а не с использованием необработанных байтов сгенерировал HMAC SHA1 хэш

+0

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

Смежные вопросы