前回の"「Product Advertising API」をPHP4から使う。その一。HMACへの道。"の続編です。
http://softyasu.blog121.fc2.com/blog-entry-100.html
今回は自前でHMACを実装します。
HMACはRFC2104として公開されていますので、まずその情報をご覧下さい。
http://www.ipa.go.jp/security/rfc/RFC2104JA.html
で、要約すると次のような処理をします。
(1)秘密キーがハッシュのブロック長より大きければ、秘密キー自体をsha256ハッシュ化する。
(2)秘密キーがハッシュのブロック長より小さければ、0でパディングする。
(3)ipadkeyは、ハッシュのブロック長分の0x36と秘密キーのxorをとって作る。
(4)opadkeyは、ハッシュのブロック長分の0x5cと秘密キーのxorをとって作る。
(5)ipadkeyとメッセージ(ハッシュ化データ)を結合して、sha256ハッシュ化する。
(6)opadkeyと(5)の結果を結合して、sha256ハッシュ化する。
で(6)の結果がMACって事になります。
SHA256ハッシュは下記のものを使っています。
http://www.nanolink.ca/pub/sha256/
では、PHPで書いたHMACのクラスです。
| <?php ##################################################################### # HMAC-SHA256専用クラス # Copyright (c)ソフト屋 巣 ##################################################################### // sha256ライブラリ require_once('sha256.inc.php'); // 参考:RFC2104 http://www.ipa.go.jp/security/rfc/RFC2104JA.html class HMAC_SHA256 { var $ipadkey; //innerパッドキー var $opadkey; //outerパッドキー var $pack_form; //packフォーマット。ブロック長とフォーマット。 //================================================== // コンストラクタ // $key HMACの鍵 //================================================== function HMAC_SHA256($key) { $this->pack_form = "H64"; //SHA256専用。 define("HASH_BLOCK_SIZE",64); //ブロック長 // 鍵のパディング。 if(strlen($key) > HASH_BLOCK_SIZE) { $key = pack($this->pack_form,sha256($key));//大きい場合はハッシュ化。 } elseif(strlen($key) < HASH_BLOCK_SIZE) { $key = str_pad($key,HASH_BLOCK_SIZE,chr(0)); } // inner/outerパッドキーの作成。 $this->ipadkey = (substr($key,0,HASH_BLOCK_SIZE) ^ str_repeat(chr(0x36),HASH_BLOCK_SIZE)); $this->opadkey = (substr($key,0,HASH_BLOCK_SIZE) ^ str_repeat(chr(0x5C),HASH_BLOCK_SIZE)); } //================================================== // HMAC関数 // $msg メッセージ //================================================== function hmac($msg) { // innerハッシュ $hashin = sha256($this->ipadkey.$msg); // innerハッシュにouterを合成してハッシュを求める。 $hash = sha256($this->opadkey.pack($this->pack_form,$hashin)); // パックして持ち帰る。 return pack($this->pack_form,$hash); } } ?> |
今回は、ここまで。
次回は実際にHMACを使うサンプルコードをお見せします。
つづく。
以上です。お役に立ちましたら拍手をお願いします
2009/05/19 |
未分類
| COMMENT(1)
| TRACKBACK(0)
TOP
コメント
助かりました
PHP4でSHAをどうするのか悩んでましたが、大変助かりました
ありがとうございます
No:18 2009/07/28 03:17 | GEφ #Nkm.CmPw URL [ 編集 ]
コメントの投稿
トラックバック
この記事にトラックバックする(FC2ブログユーザー)