スポンサーサイト

一定期間更新がないため広告を表示しています

[Google PR]

Twitterはじめました。プラプラ | Twitter

【Access】vbaでhmacが正しく計算できた!!

以前のエントリ、【Access】vbaでhmacが正しく計算できない、なぜだ(ロジックがおかしいんだろうが。。。)
が、有用なコメントをいただき無事解決したので、
ここに別エントリとして起こしておきます。

事の始めは、amazonのapiを利用するためには、
リクエストにhmacで暗号化した署名をつける必要があったことでした。

で、VBAでのhmac暗号化の方法をネットで調べてみると、
皆さんいいところまでいくのですが、
hmac取得ができ、なおかつそのソースを公開されている人はいないようでした。

私も結局、hmac取得はできずじまい。

しかし、以前のhmac取得の間違ったコードのエントリをみたYU-TANGさんに
コメントでソースを修正していただき、正しいhmacを取得することができました。

ここで、そのソースを紹介したいと思います。

前準備として、hashを求める関数を準備。
これは、
スーの道具箱/VBでハッシュを求める
を、標準モジュールへコピペ。

で、以下のhmacテスト用ソースをとりあえず標準モジュールへコピー。
Function HmacTest() As String
'メッセージ認証コードを作成する(hmac ハッシュ:SHA256)
'
'thanks!
'2010/03/17 ハッシュ処理2回目のロジックはYU-TANGさん
'http://plus-sys.jugem.jp/?eid=215 (コメント部)
'
Dim i As Integer
Dim hash As String
Dim arKey() As Byte
Dim ipad As String
Dim opad As String
Dim Key As String
Dim text As String
Dim buff() As Byte, offset As Integer

'認証コード作成対象セット
Key = "microsoft" '秘密鍵
text = "access2003" 'メッセージ文字列

'初期化
ipad = ""
opad = ""
ReDim arKey(0 To 63)

'秘密鍵から1文字づつ読込み、文字コードへ変換後配列へ格納
For i = 0 To Len(Key) - 1
arKey(i) = Asc(Mid(Key, i + 1, 1))
Next

'64文字に満たない分は、ゼロセット
For i = Len(Key) To 63
arKey(i) = 0
Next

'innerpad及びouterpad作成
For i = 0 To 63
ipad = ipad & Chr(arKey(i) Xor &H36)
opad = opad & Chr(arKey(i) Xor &H5C)
Next

'ハッシュ処理1回目
'(innerpad+メッセージ文字列)をハッシュ・・・ハッシュ結果1
hash = CreateSHA256HashString(ipad & text)

'ハッシュ処理2回目(modify by YU-TANGさん)
'(outerpad+ハッシュ結果1)をハッシュ・・・メッセージ認証コード作成完了
buff = StrConv(opad, vbFromUnicode)
offset = UBound(buff)
ReDim Preserve buff(offset + Len(hash) ¥ 2)

For i = 1 To (Len(hash) ¥ 2)
buff(offset + i) = CByte("&H" & Mid(hash, (i - 1) * 2 + 1, 2))
Next
hash = CreateSHA256Hash(buff)

'結果をイミディエイトウインドへ表示
Debug.Print "[作成された認証コード]" & vbCrLf & hash

End Function


試しに動かしてみます。
デバッグウィンドから、?HmacTestで実行。
access vba hmacテスト実行結果

別言語で計算した結果は、以下。
「9adeae7b87cc1354131018ab2f69f8f195b9d44ed6f6d2e463653cc2904eeb47」
vbaの計算結果と同じですね。

見事、vbaでhmacの計算ができました。

hmacがクリアできれば、AccessVBAからamazonのapiが使えると思います。
(あと、base64エンコード、URLエンコード等の情報はネットで入手できます。)

また今度、amazonのapiで情報を取得するサンプルまでをご紹介したいと思います。
(おまえの今度はいつなんだよ!って話があったり、なかったり。。。)
[Google PR]

Twitterはじめました。プラプラ | Twitter

スポンサーサイト

[Google PR]

Twitterはじめました。プラプラ | Twitter

<< 【セキュリィー】ボットネットMariposaは1200万のクライアントを吸い込む。
【Access】Office20010(Access2010)がいよいよリリースですね。 >>

[関連エントリ 最新5]

[Google PR]


[最新エントリ 5]

>>トップページ

コメント
すみません、質問です。
現在上記ルーチンを使い認証コードを取得して、Amazon api から情報取得しようとしているのですが

GET
ecs.amazonaws.jp
/onca/xml
AWSAccessKeyId=1SM7CKHWKSJKJFPKBA02
&Operation=ItemSearch
&ResponseGroup=Request%2CImages
&Service=AWSECommerceService
&Timestamp=2009-07-22T13%3A41%3A39Z
&Version=2009-07-01

という文字列をどのようにtextに入れればよいのでしょうか?1列の文字列で試しているのですが、認証コードが正しくないというエラーが返ってきてしまいます。

よろしくお願いします。
  • AT
  • 2010/10/15 8:53 PM
ATさま
お返事遅れてスミマセン。プラプラです。

hash値の取得自体は、文字列をそのままつっこめばOKです。

ただし、AmazonAPIの署名認証で使用する場合、
hash値をBASE64でエンコードする必要がありますが実装済ですか?
ご回答ありがとうございます。
文字列というのは、上記のものを1列にした
GETecs.amazonaws.jp/onca/xmlAWSAccessKeyId=1SM7CKHWKSJKJFPKBA02&Operation=ItemSearch&ResponseGroup=Request2CImages&Service=AWSECommerceService&Timestamp=2009-07-22T13%3A41%3A39Z&Version=2009-07-01

こちらで返ってきた値をエンコードですよね?
やったのですが、それでも認証エラーが起きてしまっております。。。
  • AT
  • 2010/10/17 10:05 PM
ご提示されたパラメーターのAWSAccessKeyIdは
ご自身がAmazonで取得されたものですか?
また、hash時の暗号化キーも同様ですが、セットできていますか?

あと、パラメーターのタイムスタンプは、取得時の時間じゃないと、認証は通りますがエラーになるかと。
(2009-07-22T13%3A41%3A39Z&のところ)

以下のサイトで正常なリクエストパラメータを作成可能です。一度、御確認下さい。
http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html
ご回答ありがとうございます。
AWSAccessKeyId、それから暗号化キーもAmazonから送られてきたものをセットしております。

タイムスタンプは、こちらネットから拾ったものをコピペなのですが、こちら当日の日付と時間ということでしょうか?

そちらのサイトでも試したのですが、同じように認証キーが違うというエラーが帰ってきてしまいます・・・

パラメターのセットが間違えているのでしょうか?
  • AT
  • 2010/10/18 8:07 AM
前回ご提示させていただいたサイト
http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html
で、正しいリクエストを作成しテストされてはいかがでしょうか?

AWS Access Key IDと、AWS Secret Access Keyを入力し、

Here is an sample unsigned URL you can use to get started with:
にあるサンプルリクエストを、
Unsigned URL:へ貼り付けて実行すると、
Signed URL:に署名つきの正しいリクエストが生成されると思います。

よろしくお願いします。
ご回答ありがとうございます。
何度もすみません・・・

先日より上記のサイトで何度も確認してAWS Access Key IDと、AWS Secret Access Keyを
入力しテストしているのですが、エラーが出てしまいます・・・

貼り付けるUnsigned URLは

http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService
&Version=2009-03-31
&Operation=ItemSearch
&SearchIndex=Books
&Keywords=harry+potter

をそのままですよね?これでエラーが出るということは、AWS Access Key IDとAWS Secret Access Keyが間違っているということでしょうか?

ほんとに何度もすみません。。。。
  • AT
  • 2010/10/18 10:23 AM
http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html
のサイトで生成したURL
(Signed URL欄に出力されたURL)
を、ブラウザのアドレスに貼り付ける
とエラーが返ってきたということでしょうか?

でしたら、AWS Access Key IDか、AWS Secret Access Keyが間違っているかと。
ご回答ありがとうございます。

何度も試しているのですが、やはり結果はかわらず・・・
新規アカウントやAccess Key等も再取得したりと
いろいろためしてはみたのですが、相変わらず
エラーでかえってきてしまっております・・・
もうちょっと色々ためしてみますね、ほんとに
何度もありがとうございました。
またよろしくお願いします^^
  • AT
  • 2010/10/18 2:38 PM
そうですか。。。

また何かありましたら、お気軽にどうぞ。では。
はじめまして。

キーつきSHA-256の記事とても参考になりました。
Signature生成時にcrlfの代わりにlfを使うところでちょっと躓きましたが
おかげで無事にAmazonに問いあわせができるVB6クラスが作成できました。

ありがとうございました。
  • Gaz
  • 2010/11/24 12:59 PM
>Gazさま
お役にたてたようでよかったです。


検索でここにたどり着きました。
base64エンコードをHEXとしていなかったので小一日ハマりましたが、
おかげさまで、VBAからAWSを利用することができました。
とても感謝です!
  • HAL
  • 2010/12/23 5:22 PM
>HALさま
お役にたてたようでよかったです。
base64エンコードの部分をネットで探してやってみましたが「SignatureDoesNotMatch」となってしまいます。
base64エンコードの部分も教えてもらえませんか?
  • nob
  • 2014/05/12 3:50 PM
>nobさま
今手元にソースコードがないのですが、VBAでAmazonAPIを利用したいということですよね?
でしたら、EXCEL VBAですがソースコードを
公開されている方がいらっしゃいます。
Excel VBAでAmazon Product Advertising API を使う
http://anarchistraw.blogspot.jp/2011/11/excel-vbaamazon-product-advertising-api.html
上記のエントリが参考になるかと思います。
Githubでサンプルファイルのダウンロードも
できます。

他には、
Amazon Product Advertising API を Excel VBA で直接たたく
http://bookstore.g.hatena.ne.jp/kt_kyoto/20120128/1327776443

ご参考まで。

こんにちは!
大変参考になりました!

vbaでSHA256を実行しようと思い、こちらにたどり着きました。
上記の通り、実行で正しい結果を得ることができました。
ありがとうございます。

SHA512もやりたいと思い、呼び出す関数を256→512にするだけでいいと思ったのですが、linuxでSHA512を実行した結果と一致しませんでした。
何かご存知あれば教えて頂けないでしょうか。
  • まさ
  • 2018/06/01 8:33 AM
コメントする(お気軽にどうぞ)









この記事のトラックバックURL
トラックバック
カテゴリー
プロフィール
links
recent comment
  • 【Access】コンボボックス対応版。超簡単な帳票フォームでの矢印上下キー行移動。
    山田 裕樹 (04/28)
  • 【Access】vbaでhmacが正しく計算できた!!
    まさ (06/01)
  • 【Access】AccessReportMailメール送信時のポートを25から587へ
    わら (05/31)
  • 【SQLServer】超シンプル!再帰CTE(共通テーブル式)で連続データを作成する。
    sazi (09/08)
  • 【あまっちゃお】Amazon商品検索「あまっちゃお」プロジェクト始動。Ver00-06-00 β
    カメちゃん (07/31)
  • 【Access】あれ?DoCmd.RunCommand acCmdSaveRecordの内部仕様が変わった?
    花姉 (03/17)
  • 【Access】実行中のmdb(自分自身)をバックアップコピーする方法。
    亀 (02/06)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    管理人 (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    あ (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    K (11/13)
recent trackback
  • 【Access】2003安全でない式がブロックされていませんとセキュリティーレベル。
    awgs Foundry (10/29)
  • 【VAIOtypeP】液晶保護シートは、新車のカバーではない。レイアウト社液晶/天板保護フィルムセットRT-VP1FS1
    XMLがキライ。 (04/09)
  • Vistaから、LinkStation(NAS)にアクセスできません。
    そのほかいろいろ (09/06)
sponsored links