---
title: "TOTP a HOTP — Crypto for Laravel | Roundly"
description: "TOTP podľa RFC 6238 a HOTP podľa RFC 4226 s časovo vyrovnaným tolerančným oknom a URI otpauth:// na registráciu v aplikácii."
url: https://roundly-consulting.com/sk/open-source/navody/crypto-for-laravel/jednorazove-hesla
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Crypto for Laravel](https://roundly-consulting.com/sk/open-source/navody/crypto-for-laravel.md)

# 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:

```php
use RoundlyConsulting\Crypto\Facades\Crypto;

$secret = Crypto::random()->secret(32);                                   // enrol
$uri    = Crypto::provisioningUri($secret, 'alice@example.com', '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:

```php
use RoundlyConsulting\Crypto\Otp\Totp;
use RoundlyConsulting\Crypto\Otp\ProvisioningUri;
use RoundlyConsulting\Crypto\Random\Secret;

$secret = Secret::base32(32);                     // enrol
$uri = ProvisioningUri::totp($secret, 'alice@example.com', '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.

## Požiadavky na tajný kľúč

Tajný kľúč sa musí dekódovať — ako striktný kanonický base32, kde neplatný znak vyhodí InvalidEncodingException — na aspoň 10 bajtov (80 bitov, Hotp::MIN\_SECRET\_BYTES), ktoré nie sú všetky nulové. Inak Hotp::at(), a teda každá metóda Totp, ktorá počíta kód (at(), codeAt() a verify(), keď je kód správne formátovaný), vyhodí InvalidOtpParameterException: emptySecret() — zvyčajne chýbajúca hodnota v konfigurácii — shortSecret() alebo zeroSecret(). HMAC krátky kľúč doplní nulami, takže prázdny či celý nulový kľúč dáva kódy, ktoré vypočíta ktokoľvek. Nových používateľov registrujte cez Secret::base32(), ktorý predvolene vygeneruje 160 bitov (32 znakov); hranica 80 bitov zabezpečí, že 16-znakové tajné kľúče, ktoré autentifikačné aplikácie roky vydávajú, sa naďalej overia.

## 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:

```php
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ó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:

```php
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:  'alice@example.com',
    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
```

ProvisioningUri::totp() tajný kľúč tiež overí, takže aplikácia nikdy nedostane kľúč, ktorý Totp nevie dekódovať: tajný kľúč mimo base32 vyhodí InvalidEncodingException, prázdny InvalidOtpParameterException::emptySecret(). Do URI sa zapíše veľkými písmenami a bez paddingu, nech prišiel v akejkoľvek veľkosti písmen či s paddingom. Hranica 80 bitov sa tu neuplatňuje — ak registrujete cez Secret::base32(), nikdy na ňu nenarazíte.

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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/crypto-for-laravel.md)
