2

いくつかの REST Web サービスを利用するアプリケーションを開発しています。技術文書には、リクエストで文字列の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 で記述されています。

私は C# でアプリケーションを開発しており、実行時にまったく同じ文字列を使用しています。

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

末尾の「=」記号を削除すると、次のようになります。

Vw8pl/KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw

したがって、アプリケーションは実行に失敗し、署名の不一致エラーが発生します。

ハッシュの前に文字列をバイト配列に変換しながらエンコーディングを変更しようとしましたが、何も変わりませんでした。

何か案は?

4

1 に答える 1

8

ドキュメントhereに基づいて、文字列に - (ダッシュ) がありません。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);
于 2009-06-12T02:36:15.833 に答える