NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

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-based

Alebo 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 instant

verify() 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ódaVraciaPoznámky
at($secret, $timestep)stringKód pre explicitný index časového kroku.
codeAt($secret, $timestamp = null)stringKód pre unixový timestamp (predvolene teraz).
timestepAt($timestamp)intIndex časového kroku pre timestamp.
verify($secret, $code, $window = 1, $timestamp = null)int|falseZhodný č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=30

Algoritmy 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 kryptomien

Odoslaní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.