Я разрабатываю приложение, которое использует некоторые веб-службы 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.
Я разрабатываю свое приложение в С# и для точно такой же строки, когда я выполняю:
byte[] rawHash = sha256.ComputeHash(rawRequest, 0, rawRequest.Length);
string friendlyHash = Convert.ToBase64String(rawHash);
и удалите завершающие знаки "=", я получаю:
Vw8pl/KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw
и, следовательно, приложение не выполняется, что приводит к ошибке несоответствия подписи.
Я попытался изменить кодировку, преобразовывая строку в массив байтов, предшествующий хэшированию, и ничего не изменилось.
Любые идеи?
На основе документа здесь вы не указали в своей строке символ - (это тире). Кажется, что Acrobat успешно удаляет его в скобке для копирования из документа...
Вот некоторый код, который я разделил вместе, который получает то же значение, что и пример (ну, если бы вы обрезали final =)
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);