質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3759閲覧

【Python】hmacの計算が正しく行えない

pockygame

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/01/09 03:10

編集2018/01/09 04:38

Amazon MWSに接続するために以下のコードを書きました。
MWSとは決められたリクエストを行うと、Amazonの商品データなど欲しいデータを返してくれるものです。
MWSでは、リクエストの際、署名対象の文字列に対してhmacで暗号化をしたものをリクエストする必要があります。
また、「自分のしたいリクエストを行う場合、署名対象の文字列と暗号化後の文字列はこうなりますよ」というのを教えてくれるツールが提供されています。
(ツールはこちらです)https://mws.amazonservices.jp/scratchpad/index.html

そこでhmacの計算が正しく行われているかを確認するために以下のコードを書いたのですが、
そのツールでの計算と一致しません。

========

Python

1import hmac 2import hashlib 3import base64 4 5secret_key = b"取得した秘密キー" 6 7canonical = b""" 8POST 9… 「署名対象の文字列」をここにコピペ … 10""" 11 12h = hmac.new(secret_key, canonical.strip(), hashlib.sha256) 13 14print(h.hexdigest()) 15print(base64.b64encode(h.digest())) 16

========

※取得した秘密キーと署名対象の文字列にはそれぞれ本当のキーを入れています

どなたか何か可能性でも良いのでご指摘いただけますと幸いです。
よろしくお願い致します。

(参照元ブログ)https://tech.torico-corp.com/blog/amazon-marketplace-mws-api/

【2018/01/09追記】
署名対象の文字列を実行する部分のコードも合わせて転記させていただきます。
(実行しているコード全文です)

Python

1import base64 2import datetime 3import hashlib 4import hmac 5from urllib import quote 6 7import requests 8 9AMAZON_CREDENTIAL = { 10 'SELLER_ID': 'セラーID', 11 'ACCESS_KEY_ID': 'AWSアクセスキーID', 12 'ACCESS_SECRET': 'アクセスシークレット', 13} 14 15DOMAIN = 'mws.amazonservices.jp' 16ENDPOINT = '/Orders/2013-09-01' 17 18 19def datetime_encode(dt): 20 return dt.strftime('%Y-%m-%dT%H:%M:%SZ') 21 22timestamp = datetime_encode(datetime.datetime.utcnow()) 23 24last_update_after = datetime_encode( 25 datetime.datetime.utcnow() - datetime.timedelta(days=1)) 26 27data = { 28 'AWSAccessKeyId': AMAZON_CREDENTIAL['ACCESS_KEY_ID'], 29 'Action': 'ListOrders', 30 'MarketplaceId.Id.1': 'A1VC38T7YXB528', 31 'SellerId': AMAZON_CREDENTIAL['SELLER_ID'], 32 'SignatureMethod': 'HmacSHA256', 33 'SignatureVersion': '2', 34 'Timestamp': timestamp, 35 'Version': '2013-09-01', 36 'LastUpdatedAfter': last_update_after, 37} 38 39query_string = '&'.join('{}={}'.format( 40 n, quote(v, safe='%')) for n, v in sorted(data.items())) 41 42canonical = "{}\n{}\n{}\n{}".format( 43 'POST', DOMAIN, ENDPOINT, query_string 44) 45 46h = hmac.new( 47 bytes(AMAZON_CREDENTIAL['ACCESS_SECRET']), 48 bytes(canonical), hashlib.sha256) 49 50signature = quote(base64.b64encode(h.digest()), safe='') 51 52url = 'https://{}{}?{}&Signature={}'.format( 53 DOMAIN, ENDPOINT, query_string, signature) 54 55response = requests.post(url) 56 57print(response.content.decode())

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pockygame

2018/01/09 04:40

ご教授ありがとうございます。追記・編集致しましたのでご覧いただけますと幸いです。
guest

回答1

0

ベストアンサー

こんな感じでどうでしょうか。
とりあえず、質問文に記載されているツールにて作成したダミーデータの結果と比較したところ問題なく生成できてそうです。

Python

1import hmac 2import hashlib 3import json 4import base64 5 6secret_key = "ddd" 7 8method = 'POST' 9domain = 'mws.amazonservices.jp' 10url = '/' 11params = 'AWSAccessKeyId=ccc&Action=GetFeedSubmissionCount&MWSAuthToken=bbb&Merchant=aaa&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2018-01-09T03%3A28%3A48Z&Version=2009-01-01' 12 13sig_data = '\n'.join([method, domain, url, params]) 14 15 16signature = hmac.new(secret_key.encode('utf-8'), 17 sig_data.encode('utf-8'), 18 hashlib.sha256) 19 20 21print(signature.hexdigest()) 22# 09d5c7139220b35a3b9d4d18486f5c9fd8500d29616360c42c9da359b9b58ea5 23 24print(base64.b64encode(signature.digest())) 25# b'CdXHE5Igs1o7nU0YSG9cn9hQDSlhY2DELJ2jWbm1jqU='

イメージ説明

投稿2018/01/09 05:12

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pockygame

2018/01/09 06:16

こちらを元に書き直したところ無事正しい値が得られました! 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問