SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】 TOTPのワンタイムパスワードを生成する

問題

TOTPのワンタイムパスワードをphpで生成したいです。

答え

// ライブラリを利用するか、関数を自作してbase32_decodeしてください
$binary_secret = Base32::decode($secret);
$digits = 6;
$period = 30;

$now = time();
$current_step = ($now - $now % $period) / $period;
$binary_timestamp = pack('N*', 0) . pack('N*', $current_step);

$hash = hash_hmac('sha1', $binary_timestamp, $binary_secret, true);

$offset = ord($hash[19]) & 0xF;
$otp = (
	((ord($hash[$offset + 0]) & 0x7F) << 24) |
	((ord($hash[$offset + 1]) & 0xFF) << 16) |
	((ord($hash[$offset + 2]) & 0xFF) << 8) |
	(ord($hash[$offset + 3]) & 0xFF)
) % pow(10, $digits);
$otp = str_pad($otp, $digits, '0', STR_PAD_LEFT); 

参考

base32_decode()

関連するメモ

コメント(1)

【php】どうやってデバッグしますか? at softelメモ 2010年3月11日 10:57

[…] または、古いphpでは error_log() […]