ワンタイムパスワードの技術: HOTP/TOTPの実装

前回軽く触れたHOTPのアルゴリズムはたとえばGoogle Authenticatorに実装されている。コードも公開されているので、例えばiOS版のコードを見ればiOS SDKのCommonCryptoを使った実装例が出ている。

google-authenticator - Two-step verification - Google Project Hosting

OTPGenerator.m - google-authenticator - Two-step verification - Google Project Hosting

  CCHmacContext ctx;
  CCHmacInit(&ctx, alg, [secret_ bytes], [secret_ length]);
  CCHmacUpdate(&ctx, [counterData bytes], [counterData length]);
  CCHmacFinal(&ctx, [hash mutableBytes]);

例えば数値はあらかじめビッグエンディアンにしておくとか細かいお約束はあるけれど、計算としてはsecretの値でHMAC生成機を初期化して、カウンターの値で更新する、基本はたったそれだけ。TOTPの場合カウンター値が現在時刻(をタイムフレームで割ったモノ)になる。

サポートしているハッシュアルゴリズムSHA-1だけじゃなくて、後継のSHA-256/512MD5もサポートしているようだ。MD5コリジョンが発見されているし、SHA-1は理論的には脆弱であることがわかっている。ただHMACで使う分にはコリジョンは大きな問題では無いというのは前回書いたとおり。