C++でHMAC(メッセージ認証のための鍵付ハッシング)の実装を書いてみました。
Githubにコードを置いたので、実際のコードはここを見てください。
https://github.com/chromabox/hashcodes
ライセンスは一応MITライセンスになってます。
一応テストはしましたが、未保証です。
事の経緯
HMACの実装自体も、ライブラリも巷にあふれているんですが、HMACの仕様書を見てちょっと真面目に書き直したくなったので、せっかくだからテンプレートなどを使って書き直してみたかったという感じです。
周りに読める人が少ないということで、あまりテンプレートは使ってこなかったのですが、たまに使わないと忘れてしまうので、今回は良い題材になりました。
使い方
今のところg++にのみ対応しています。STLも必須です。
コンパイルオプション等はMakefileを見てください。
使い方はテストコードを見れば大体分かるのですが、HMAC-SHA1を算出する場合は次のようにします。
#include "hmac.hpp"
void test()
{
using namespace std;
string digest;
string key("keykey");
string data("abcdefg");
hmac_sha1::create_digest(data.c_str(),data.size(),key.c_str(),key.size(),digest);
cout << digest << endl;
}
ダイジェストはstring以外にもstd::uint8_t型を渡すことも出来ますが、hmac_sha1の場合はsha1::DIGEST_LENGTHのサイズ以上でないといけません。
また、同様にMD5用の実装であるhmac_md5もあります。
おまけとして、sha1、md5の値算出も出来ます。
sha1値を求める場合は以下のようにします。
#include "sha1.hpp"
void test()
{
using namespace std;
sha1 hasher;
string digest;
string data("abcdefg");
hasher.update(data.c_str(),data.size());
hasher.final(digest);
cout << digest << endl;
}
TODO
- SHA2xx系ハッシュ関数の追加
- 他の言語に対する実装(手始めにpureなCかな)
- MSVCでコンパイルできるようにする
参考文献など
RFC 2104 HMAC:メッセージ認証のための鍵付ハッシング (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC2104JA.html
RFC 1321 MD5 メッセージダイジェストアルゴリズム (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC1321JA.html
RFC 3174 US Secure Hash Algorithm 1 (SHA1) (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC3174JA.html
RFC 2202 HMAC-MD5 と HMAC-SHA-1 のためのテストケース (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC2202JA.html
boostのSHA1の実装
boost/uuid/sha1.hpp
linuxのSHA1の実装
linux/crypto/sha1_generic.c