oauth_body_hash

oauth_body_hash

[21] oauth_body_hash 引数は、 payload bodyハッシュ値を指定するものです。

[23] OAuth 1.0 本体仕様では application/x-www-form-urlencoded 以外の payload body署名の計算に反映されないため、replay攻撃が可能となってしまいます。 これを避けたい時に本引数により payload bodyハッシュ値を指定することができます。

[24] 本機能は OAuth 1.0 本体に含まれない拡張であり、また HTTPS を採用した OAuth 2.0 が現在普及していることもあり、それほど広く使われてはいません。 しかしクライアントライブラリーで本機能を使っているものがあり、 無視できない程度には使われているため OAuth 1.0は本機能を実装する必要があります。

仕様書

ハッシュ関数の選択

[3] oauth_signature_methodHMAC-SHA1RSA-SHA1 なら、 SHA1 を使わなければなりません >>2

[4] PLAINTEXT なら、 oauth_body_hash を使うべきではありません >>2

[5] それ以外の署名方式を規定する際には、 oauth_body_hashハッシュアルゴリズムを規定するべきです >>2

値の計算

[6] oauth_body_hash の値は、 payload body (なければ空文字列) にハッシュ関数を適用した結果を RFC 4648 Base64 符号化したものとしなければなりません >>2

文脈

[7] 一時credentials要求トークン要求には、 oauth_body_hash 引数を含めるべきではありません >>2

[11] 実装によっては未知の引数をエラーとするため、また OAuth引数は既に oauth_signature に含まれているためセキュリティー上の問題とならないためとされています >>2

[8] Content-Type: application/x-www-form-urlencoded要求には oauth_body_hash 引数を含めてはなりません >>2

[19] 攻撃に使われる可能性があるため >>2 とされています。

[9] それ以外の要求には oauth_body_hash 引数を含めるべきです >>2

[10] とされていますが、相互運用性のため、 oauth_body_hash 引数を含めるべきではありません。仕様は OAuth 1.0 本体に引数を追加するだけなので後方互換性がある >>2 と述べていますが、実際には oauth_signature 引数署名の計算方法が変わってしまっているため、 クライアントoauth_body_hash を送ってきているなら、 oauth_body_hash に対応していないと署名不一致のエラーになってしまいます。

[12] 認証された要求も参照。

検証

[13] Content-Type: application/x-www-form-urlencoded要求oauth_body_hash 引数が指定されていれば、 攻撃の可能性があるため、拒絶しなければなりません >>2

[14] oauth_body_hash 引数を指定するべき場合で含まれていなければ、 相互運用性のためその要求を受け入れても構いませんし、 セキュリティーのため拒絶しても構いません。 >>2

[15] 実際には oauth_body_hash を送らないクライアントが多いので、 相互運用性のため拒絶するべきではなさそうです。

[16] は、指定された値と計算した値が一致しなければ、 拒絶しなければなりません >>2

[17] は、最終的な値を比較するかわりに、 Base64 復号したものを比較しても構いません >>2

[18] これはパーセント符号化Base64 符号化の実装の違いを吸収するため >>2 とされています。しかし本規定によってますます相互運用性の問題が深刻化する可能性があると思いますが・・・。
[20] 実装によっては検証を省略し、認証された要求としての署名の計算にだけ使うものもあるようです。 実質的に oauth_body_hash 引数を実装していない場合と同じですが、 oauth_body_hash を送ってくるクライアントからの要求も処理できるという利点があります。
[22] oauth_body_hash 引数を指定するクライアントライブラリーが存在していて使われているため、 は最低でも >>20 のような形で oauth_body_hash 引数に対応せざるを得ません。

歴史

[1] Implementers' Draft: OAuth Request Body Hash 1.0 Draft 1 ( 版) <http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/drafts/1/spec.html>

[25] draft-eaton-oauth-bodyhash-00 - OAuth Request Body Hash ( 版) <https://tools.ietf.org/html/draft-eaton-oauth-bodyhash-00>

[26] Authentication — Marketplace API 2.0 documentation ( 版) <http://firefox-marketplace-api.readthedocs.org/en/latest/topics/authentication.html#shared-secret>

Example headers (new lines added for clarity):

Content-type: application/json

Authorization: OAuth realm="",

oauth_body_hash="2jm...",