Разница в хэше SHA между рубином и C # - PullRequest
2 голосов
/ 12 июня 2009

Я разрабатываю приложение, которое использует некоторые веб-сервисы REST. В технической документации сказано, что я должен передать хеш SHA256 какой-либо строки в запросе.

В примере запроса (в документации) строка:

HN-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires = 1893013926label [0] = любая / somestatistics = 1d, 2d, 7d, 28d, 30d, 31d, lifetimestatus = у.п.л., livetitle = а

После выполнения:

digest = Digest::SHA256.digest(string_to_sign)
signature = Base64::encode64(digest).chomp.gsub(/=+$/, '')

приводит к хешу:

YRYuN2zO + VvxISNp / vKQM5Cl6Dpzoin7mNES0IZJ06U

Этот пример написан на ruby, так как документация предназначена для разработчиков ruby.

Я разрабатываю свое приложение на C # и для точно такой же строки, когда я выполняю:

byte[] rawHash = sha256.ComputeHash(rawRequest, 0, rawRequest.Length);
string friendlyHash = Convert.ToBase64String(rawHash);

и убираю завершающие знаки "=", получаю:

Vw8pl / KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw

и, следовательно, приложение не запускается, что приводит к ошибке несоответствия подписи.

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

Есть идеи?

1 Ответ

8 голосов
/ 12 июня 2009

Исходя из документа здесь , вам не хватает - (это тире) в вашей строке. Похоже, что 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);
...