【保存版】2013年度発売全パチスロアプリ一覧(iPhone,iPad)

【Access】vbaでhmacが正しく計算できない、なぜだ(ロジックがおかしいんだろうが。。。)

vbaからamazonのapi 「Product Advertising API」を使いたいと思い
ここ2日ほど試行錯誤していますが、どうしても暗号化した署名が作成できません。。。

海外のvb系のソースサンプルを元に作ったのですが、
なぜ正しく計算されないのだ。。。

とりあえず、署名作成は別のアプリケーションで行うようにしようかと
思いますが、今現在のhmac生成のソースコードを書いておきます。
何かのヒントになれば幸いです。&
もし、わかる人がいれば修正点を教えて下されー。

では、実際のコードの説明。

まず、sha256(しゃーと読むらしい)でハッシュする部分ですが、
スーの道具箱/VBでハッシュを求める
のソースコードを使用させていただきました。
これを、標準モジュールへコピペ。
結果を検証してみると、きちんとhash処理できているようです。


次にhmacの部分ですが、海外のサイトの掲示板にあったコードをコピーして
作りました。これも、標準モジュールへ作りました。
こんな感じ、

[メイン部分]
Function HmacTest() As String
'メッセージ認証コードを作成する(hmac ハッシュ:SHA256)
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

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

'初期化
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回目
'(outerpad+ハッシュ結果1)をハッシュ・・・メッセージ認証コード作成完了
hash = CreateSHA256HashString(opad & StrHex(hash))

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


End Function


[サブファンクション]
Function StrHex(text As String) As String
Dim lCount As Long
Dim sResult As String
Dim lLength As Long

lLength = Len(text)
For lCount = 1 To lLength Step 2
sResult = sResult & Chr(Val("&H" & Mid(text, lCount, 2)))
Next
StrHex = sResult
End Function



イミディエイトウインドから、?HmacTestで実行します。

上記のソースコード中に、秘密鍵とメッセージが記述されていますが、
・秘密鍵:12345
・メッセージ:1
をhmacで暗号化しています。
で結果が、
5616f33c02ae6f6f47b376769601d0e4cbf1656e444a87f1b47e7e3274217d11

検証用として、phpのhash_hmac関数で計算した結果が、
8367e82e79ff331ba30d0f8244ab438b756e8cefe5d52ce82c88617dc37b5afc

全然ちがう。。。
ちなみに、phpの計算式は以下のとおり。

$key = "12345";
$text ="1";
$hash = hash_hmac("sha256",$text,$key,false);
echo '[作成された認証コード]'.$hash;


ネットにあったjavascript版で計算した結果もphpと同様でした。

どこがおかしいんでしょうか???

2010/03/17追記
本件は、YU-TANGさんからのコメントで解決しました。

↓のエントリにまとめました。
【Access】vbaでhmacが正しく計算できた!!
[Google PR]

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

<< 【SQLServer】SQLServer2005 SQLを動的に組み立てて実行する。
【Access】WinHttpRequestOption_EnableRedirectsオプションでリダイレクト前のヘッダーを取得する。 >>

[関連エントリ 最新5]

[Google PR]


[最新エントリ 5]

>>トップページ
人気カテゴリ:AccessTips SQLServer CakePHP iPad
過去ログ(全記事一覧)

コメント
一ヶ月以上前のエントリなので、もう解決しているかもしれませんが、念のため。

原因は、下記ですね。

> hash = CreateSHA256HashString(opad & StrHex(hash))

CreateSHA256HashString を追うと分かりますが、引数で受けた文字列を
StrConv(strData, vbFromUnicode) しているところがあって、StrHex(hash)
の部分がそこで破壊されます。
StrConv しないメソッド CreateSHA256Hash() があるので、Byte 配列の
引数を用意して CreateSHA256Hash() に渡すとよいです。

インラインでベタ書きしたので美しくないですが、処理としてはたぶんこんな感じ。

'ハッシュ処理2回目
'(outerpad+ハッシュ結果1)をハッシュ・・・メッセージ認証コード作成完了
'↓↓↓mod by YU-TANG↓↓↓
'hash = CreateSHA256HashString(opad & StrHex(hash))
Dim buff() As Byte, offset As Integer
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)
'↑↑↑mod by YU-TANG↑↑↑

Access と Web の連携ネタは貴重なので、今後ともがんばってくださいまし。
それでは。
YU-TANGさん、コメントありがとうございます。また、御提供いただいたコードでテストしたところ、正常にHMACが計算できました。ありがとうございました。
*ちなみに、YU-TANGさんのサイト(http://www.f3.dion.ne.jp/~element/msaccess/)は以前から参考にさせていただいています。ACCESSの深いとこ、いってますねー。

今回はアドバイスありがとうございました。
コメントする(お気軽にどうぞ)









この記事のトラックバックURL
トラックバック
カテゴリー
プロフィール
お問い合わせ
Powered by NINJA TOOLS
links
recent comment
  • 【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)
  • 【VAIOP】VaioXと両持ちできるものすっっごくマニアックなケース。当たり前ですが在庫限り。(笑)
    管理人 (08/04)
recent trackback
  • 【Access】2003安全でない式がブロックされていませんとセキュリティーレベル。
    awgs Foundry (10/29)
  • 【VAIOtypeP】液晶保護シートは、新車のカバーではない。レイアウト社液晶/天板保護フィルムセットRT-VP1FS1
    XMLがキライ。 (04/09)
  • Vistaから、LinkStation(NAS)にアクセスできません。
    そのほかいろいろ (09/06)