- ベストアンサー
HMAC-SHA1ハッシュ関数について
- HMAC-SHA1ハッシュ関数についての質問です。HMAC-SHA1によってダイジェスト値を生成し、BASE64でエンコードしてシグニチャを生成したいと思っています。
- 参考サイトでは、GETメソッドとURL、パラメータを使ってダイジェスト値を生成しています。例示されているPHPコードを試してみましたが、期待通りのシグニチャが得られません。
- 正しいPHPコードでHMAC-SHA1ハッシュ関数を使ってダイジェスト値とシグニチャを生成する方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
このサイトに誤りがあると自分は判断します。 このサイトから参照されているサイトを見たら、このサイトの元になった説明が書かれています。 http://oauth.googlecode.com/svn/spec/ext/consumer_request/1.0/drafts/1/spec.html この説明通りにダイジェストを作ると、説明通りの結果が出ます。 $sigbase = 'GET&http%3A%2F%2Fprovider.example.net%2Fprofile&oauth_consumer_key%3 Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHM AC-SHA1%26oauth_timestamp%3D1191242096%26oauth_version%3D1.0'; $key = 'kd94hf93k423kf44&'; $hmac = base64_encode(hash_hmac('sha1', $sigbase, $key, true)); echo "$hmac\n"; 当然、エンコードするところからやっても同じです。 $method = 'GET'; $url = 'http://provider.example.net/profile'; $contents = 'oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oa uth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_version=1.0'; $sigbase = urlencode($method).'&'.urlencode($url).'&'.urlencode($contents); $hmac = base64_encode(hash_hmac('sha1', $sigbase, $key, true)); echo "$hmac\n"; しかし、リンクされていたサイトのとおりにやってもあなたと同じ結果しかでません。 $sigbase = 'GET&http%3A%2F%2Fapi.gu3.jp%2Fv1%2Ftest%2Fauth&oauth_consumer_key%3D yamashita.dyndns.org%26oauth_nonce%3Dc83b1847200bd25d918c3fb077aca16f%26oauth_si gnature_method%3DHMAC-SHA1%26oauth_timestamp%3D1219931263%26oauth_version%3D1.0' ; $key = 'kd94hf93k423kf44&'; $hmac = base64_encode(hash_hmac('sha1', $sigbase, $key, true)); echo "$hmac\n"; URLエンコードのところから作っても同じです。 $method = 'GET'; $url = 'http://api.gu3.jp/v1/test/auth'; $contents = 'oauth_consumer_key=yamashita.dyndns.org&oauth_nonce=c83b1847200bd25 d918c3fb077aca16f&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1219931263&oa uth_version=1.0'; $sigbase = urlencode($method).'&'.urlencode($url).'&'.urlencode($contents); $hmac = base64_encode(hash_hmac('sha1', $sigbase, $key, true)); echo "$hmac\n"; オリジナルのサイトの通りやってオリジナルのサイトで説明した通りの結果が出るのに対し、日本語で説明しているサイトのとおりにやってそのとおりの結果が出ていないというところから、翻訳をした人がsecretをミスって作ったのではないかと予想します。 参考までに誰かが書いたOAuth1のライブラリーを見た感じだと同じようにコードが書いてあるように見えます。 https://github.com/jrconlin/oauthsimple/blob/master/php/OAuthSimple.php というわけで、この日本語サイトを書いた人が参考にした英語版のサイトを参考にして作ることをおすすめします。
お礼
有難うございました。私のPHPでも大元のホームページの結果と同じものが確認できました。 これで安心して作成できます。 大変お世話になりました。御礼申し上げます。