TOTP a HOTP
Tajné kľúče sú base32 text, ktorý zobrazuje autentifikačná aplikácia. Používateľa zaregistrujte novým tajným kľúčom a provisioning URI (zvyčajne ako QR kód) a potom overujte jeho kódy:
use RoundlyConsulting\Crypto\Facades\Crypto;
$secret = Crypto::random()->secret(32); // enrol
$uri = Crypto::provisioningUri($secret, '[email protected]', 'Acme Inc');
$code = Crypto::totp()->codeAt($secret); // SHA1, 6 digits, 30s (default profile)
$matchedStep = Crypto::totp()->verify($secret, $userCode); // int|false, timing-flat, drift window
Crypto::totp(digits: 8)->verify($secret, $userCode); // a custom profile
Crypto::hotp()->at($secret, $counter); // RFC 4226, counter-basedAlebo volajte priamo triedy, ktoré fasáda sprístupňuje:
use RoundlyConsulting\Crypto\Otp\Totp;
use RoundlyConsulting\Crypto\Otp\ProvisioningUri;
use RoundlyConsulting\Crypto\Random\Secret;
$secret = Secret::base32(32); // enrol
$uri = ProvisioningUri::totp($secret, '[email protected]', 'Acme Inc');
$totp = new Totp; // SHA1, 6 digits, 30s (default profile)
$code = $totp->codeAt($secret);
$matchedStep = $totp->verify($secret, $userCode); // int|false, timing-flat, drift window
if ($matchedStep === false) {
// reject
}verify() vracia index zhodného časového kroku alebo false. Zhoda v kroku 0 vráti int 0, preto vždy porovnávajte cez === false.
Profily a tolerančné okno
Predvolený profil — SHA-1, 6 číslic, 30 sekúnd — zodpovedá všetkým bežným autentifikačným aplikáciám. Vlastné profily nastavíte pomenovanými argumentmi; počet číslic musí byť 6–10 a perióda aspoň 1, inak sa vyhodí InvalidOtpParameterException:
use RoundlyConsulting\Crypto\Otp\OtpAlgorithm;
use RoundlyConsulting\Crypto\Otp\Totp;
$totp8 = new Totp(OtpAlgorithm::Sha256, digits: 8, period: 60);
$totp->verify($secret, $userCode, window: 2); // ±2 steps (max Totp::MAX_WINDOW = 10)
$totp->verify($secret, $userCode, timestamp: $submittedAt); // evaluate at a specific instantverify() prejde každý krok v okne ± bez predčasného návratu, takže neskorá zhoda trvá rovnako ako skorá, a každé porovnanie prebieha v konštantnom čase. Chybne formátované kódy sa odmietnu ešte pred výpočtom HMAC. Okno musí byť 0–10 (Totp::MAX_WINDOW), inak sa vyhodí výnimka. Aktuálny čas sa číta cez CarbonImmutable::now(), takže ho v testoch pripnete.
Metódy Totp
| Metóda | Vracia | Poznámky |
|---|---|---|
at($secret, $timestep) | string | Kód pre explicitný index časového kroku. |
codeAt($secret, $timestamp = null) | string | Kód pre unixový timestamp (predvolene teraz). |
timestepAt($timestamp) | int | Index časového kroku pre timestamp. |
verify($secret, $code, $window = 1, $timestamp = null) | int|false | Zhodný časový krok, alebo false. |
HOTP a provisioning URI
Hotp počíta hodnotu podľa RFC 4226 z počítadla; ProvisioningUri zostaví odkaz otpauth://, ktorý autentifikačná aplikácia importuje. Vydavateľ je vždy explicitný argument:
use RoundlyConsulting\Crypto\Otp\Hotp;
use RoundlyConsulting\Crypto\Otp\ProvisioningUri;
$hotp = new Hotp; // SHA-1, 6 digits
$code = $hotp->at($secret, $counter); // RFC 4226 value for a base32 secret + counter
$uri = ProvisioningUri::totp(
secret: $secret,
label: '[email protected]',
issuer: 'Acme Inc',
// algorithm: OtpAlgorithm::Sha1, digits: 6, period: 30 (defaults)
);
// otpauth://totp/Acme%20Inc:alice%40example.com?secret=…&issuer=Acme%20Inc&algorithm=SHA1&digits=6&period=30Algoritmy OTP pochádzajú z Otp\OtpAlgorithm (Sha1, Sha256, Sha512). Skracovanie HOTP sa počíta bez spoliehania sa na 64-bitové celé čísla, takže kódy sú správne aj na 32-bitovom PHP.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.