Разница в хешах SHA между Ruby и C#
Вопрос
Я разрабатываю приложение, которое использует некоторые веб-сервисы REST.В технической документации сказано, что я должен передать в запросе хэш SHA256 некоторой строки.
В примере запроса (в документации) строка:
hn-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a
После выполнения:
digest = Digest::SHA256.digest(string_to_sign)
signature = Base64::encode64(digest).chomp.gsub(/=+$/, '')
приводит к хешу:
YRYuN2zO+VvxISNp/vKQM5Cl6Dpzoin7mNES0IZJ06U
Этот пример написан на Ruby, поскольку документация предназначена для разработчиков Ruby.
Я разрабатываю свое приложение на С# и для той же строки, когда я выполняю:
byte[] rawHash = sha256.ComputeHash(rawRequest, 0, rawRequest.Length);
string friendlyHash = Convert.ToBase64String(rawHash);
и удалите конечные знаки "=", я получу:
Vw8pl/KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw
и, следовательно, приложение не запускается, что приводит к ошибке несоответствия подписи.
Я пробовал изменить кодировку при преобразовании строки в массив байтов перед хешированием, но ничего не изменилось.
Есть идеи?
Решение
На основании документа здесь, вам не хватает - (то есть тире) в вашей строке.Кажется, Acrobat услужливо удаляет его при копипасте из документа...
Вот некоторый код, который я собрал вместе, который получает то же значение, что и пример (ну, было бы, если бы вы обрезали окончательный вариант =)
string s = "hn-Rw2ZH-YwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a";
SHA256Managed sh = new SHA256Managed();
byte[] request = System.Text.UTF8Encoding.UTF8.GetBytes(s);
sh.Initialize();
byte[] b4bbuff = sh.ComputeHash(request, 0, request.Length);
string b64 = Convert.ToBase64String(b4bbuff);