Hatena::Groupsubtech

sexさんのブログ RSSフィード

2007-11-18

Digest::SHA1をOO的に使うときの罠 04:09  Digest::SHA1をOO的に使うときの罠 - sexさんのブログ を含むブックマーク はてなブックマーク -  Digest::SHA1をOO的に使うときの罠 - sexさんのブログ  Digest::SHA1をOO的に使うときの罠 - sexさんのブログ のブックマークコメント

livedoor Authの認証の時にHMACのsigunatureを生成するんだけど、その時に使うDigest::HMAC_SHA1をいじってたら、hexdigest()で1回目と2回目以降で値が違うことがわかった。

% /usr/local/bin/perl -MDigest::HMAC_SHA1 -e '$a = Digest::HMAC_SHA1->new("foo"); $a->add("bar"); warn $a->hexdigest; warn $a->hexdigest; warn $a->hexdigest; warn $a->hexdigest;'
46b4ec586117154dacd49d664e5d63fdc88efb51 at -e line 1.
a8705f3f1f3557cef3c0a2788fb1c79a20db1c01 at -e line 1.
a8705f3f1f3557cef3c0a2788fb1c79a20db1c01 at -e line 1.
a8705f3f1f3557cef3c0a2788fb1c79a20db1c01 at -e line 1.

1回目の値でlivedoor Authの認証は通るけど2回目以降の値だと通らない。

HMACってそういう仕様なのかな…?

でも、以下のようにreset()を呼ぶと同じ値になる。

% /usr/local/bin/perl -MDigest::HMAC_SHA1 -e '$a = Digest::HMAC_SHA1->new("foo"); $a->add("bar"); warn $a->hexdigest; $a->reset; $a->add("bar"); warn $a->hexdigest;'
46b4ec586117154dacd49d664e5d63fdc88efb51 at -e line 1.
46b4ec586117154dacd49d664e5d63fdc88efb51 at -e line 1.

ということで2回目になると何かが変わるんじゃないかという予想の元で、Digest::HMAC_SHA1の内部で呼ばれているDigest::SHA1のperldocを眺めていたら、digest()の説明のところで

           Note that the "digest" operation is effectively a destructive,
           read-once operation. Once it has been performed, the "Digest::SHA1"
           object is automatically "reset" and can be used to calculate
           another digest value.  Call $sha1->clone->digest if you want to
           calculate the digest without reseting the digest state.

という記述を見つけた。

なるほど、Digest::SHA1のdigest()は破壊的なもので1回呼ぶ用なのね。

1回でも呼ぶと自動でreset処理されるっぽい。

もしそれをしたくなければ、以下のようにclone()を呼んでインスタンスを別に保存しておいてねってことみたい。

% /usr/local/bin/perl -MDigest::SHA1 -e '$a = Digest::SHA1->new; $a->add("barbar"); $b = $a->clone; warn $a->hexdigest; warn $b->hexdigest;'
0f6c5d02114253073f6b80c7bbcbba27548715e8 at -e line 1.
0f6c5d02114253073f6b80c7bbcbba27548715e8 at -e line 1.

これを知らないでDigest::SHA1のインスタンスを使い回してたりするとえらいめにあいそうな予感がするね。

いつもOO的に使わないでdigest_sha1()を使ってたからこんなの気付かなかったよ。

masnhtpfozmasnhtpfoz2011/03/23 07:37pb07C5 <a href="http://axxackimhsbn.com/">axxackimhsbn</a>, [url=http://eqvzvtgnvzgx.com/]eqvzvtgnvzgx[/url], [link=http://husdnkewcytn.com/]husdnkewcytn[/link], http://egldctphmlhd.com/

トラックバック - http://subtech.g.hatena.ne.jp/clouder/20071118