文字列を秘密鍵を用いてHMAC SHA 1でハッシュ化した後にBASE64エンコードしてから最後にURLエンコードするとゆうプログラムが正しく動いているかを検証しています。ソースコードは下の通りです。
C#内で定義された文字列の文字コードはUnicodeであるとネットにありましたので文字列をUnicodeエンコーディングオブジェクトでバイト配列に変換→ハッシュ化→BASE64エンコード→URLエンコードしました。
var signature = ""; var unicode_encoding = new UnicodeEncoding(); Byte[] StringToSignByte = unicode_encoding.GetBytes("apikey=apikeysample&command=deployvirtualmachine&serviceofferingid=38&templateid=241&zoneid=1"); Byte[] AccesKeyIDByte =unicode_encoding.GetBytes("SECRETKEYSAMPLE"); Byte[] hashBytes; using (HMACSHA1 hash = new HMACSHA1(AccesKeyIDByte)) { hashBytes = hash.ComputeHash(StringToSignByte); signature=HttpUtility.UrlEncode(Convert.ToBase64String(hashBytes)); } Console.WriteLine("Signature:" + signature);
結果はこのようになりました。検証のためにunicodeエンコーディング以外も使用してハッシュ化しました。
Unicodeエンコーディング: y5Pic9g9nppPCcK1HTEh3MvUyXw%3d UTF8エンコーディング: 8vjVFWLtIruwxdxNvG1CLs1mGVw%3d Shift-JISエンコーディング:8vjVFWLtIruwxdxNvG1CLs1mGVw%3d ASCIIエンコーディング: 8vjVFWLtIruwxdxNvG1CLs1mGVw%3d
こちらのサイトの一番下に正しい答えの結果があります。
秘密鍵:SECRETKEYSAMPLE 文字列:apikey=apikeysample&command=deployvirtualmachine&serviceofferingid=38&templateid=241&zoneid=1 答え:8vjVFWLtIruwxdxNvG1CLs1mGVw%3D
あれれ・・・・2つ疑問点が生まれました。
①Uncodeのエンコーディングのみ他と値が全然違うが他のエンコーディングでの値は一致している
②最後のdが小文字で答えと一致しない
みなさんの環境では答えのような結果になりますか。
また、なぜこのような検証結果になったのでしょうか。
有識者の方いましたらご教示いただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/07 11:02
退会済みユーザー
2018/11/07 11:06
2018/11/07 11:15
2018/11/07 11:20 編集
2018/11/07 11:22
退会済みユーザー
2018/11/07 11:39
2018/11/07 11:41
退会済みユーザー
2018/11/10 10:05