Egyik hitelesítő alkalmazás sem szimpatikus? Írd meg magad ~20 sorban!
Az Ügyfélkapu+ új, két faktoros hitelesítése témájában számos írás és fórum topic született már a PH!-n (Logout-on), azonban nagyjából mindegyik cikk és hozzászóló egy harmadik fél által gyártott program használatát vagy telepítését javasolta (PC-re, mobilra, böngészőbe stb.). Amikor beleástam magam a témába, az eredeti célom az volt, hogy megismerjem a TOTP (RFC 6238) szabványt és hogy kiderítsem, mennyire rocket science egy ilyet saját kezűleg lefejleszteni. Nos, kiderült, hogy nem az, PHP-ban néhány sorból összedobható:
<?php
require_once("Base2n.php");
date_default_timezone_set('Europe/Budapest');
$base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', false, true, true);
function h(string $key, int $pad, string $text)
{
$key = str_pad($key, 64, chr(0x00), STR_PAD_RIGHT);
for ($i = strlen($key) - 1; $i >= 0; $i--) {
$key[$i] = chr(ord($key[$i]) ^ $pad);
}
return hash('sha1', $key . $text, true);
}
$t = time();
$t30 = (int)floor($t / 30);
$c = hex2bin(str_pad(dechex($t30), 16, '0', STR_PAD_LEFT));
$key = $base32->decode('IDEJONAZUGYFELKAPUTOLKAPOTT16JEGYUKULCSOD');
$h = h($key, 0x5c, h($key, 0x36, $c));
$o = ord($h[strlen($h) - 1]) & 0x0f;
$r = (ord($h[$o]) & 0x7f) << 24
| ord($h[$o + 1]) << 16
| ord($h[$o + 2]) << 8
| ord($h[$o + 3]);
echo str_pad($r % 1000000, 6, '0', STR_PAD_LEFT) . "\n";