Вопрос

Я разрабатываю приложение, которое использует некоторые веб-сервисы 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top