Skip to content

20 • Ověřování identity v prostředí internetu

Základní pojmy

PojemOtázkaVýznam
Identifikace"Kdo jsi?"Uživatel říká, kdo je (zadá jméno, e-mail)
Autentizace (authentication)"Opravdu jsi to ty?"Ověření identity (heslo, otisk, token)
Autorizace (authorization)"Co smíš dělat?"Kontrola oprávnění (role, scope)

Pořadí: identifikace → autentizace → autorizace.

Klasický chyták u maturity: autentizace a autorizace se zaměňují, protože oboje začíná na "auto-". Mnemotechnika: autentizace = identita, autorizace = pravomoc.

Hashování vs šifrování (často matoucí)

HashováníŠifrování
SměrJednosměrné (nelze vrátit)Obousměrné (lze dešifrovat)
Délka výstupuPevná (např. 256 bitů)Závisí na vstupu
PoužitíHesla, integrita souborůData v přenosu, citlivá data v DB
Algoritmybcrypt, Argon2, SHA-256AES, RSA, ChaCha20

Heslo se hashuje, jméno uživatele se nehashuje. Číslo kreditky se šifruje v DB, ale ne hashuje (musíš ho přečíst pro platbu).

Faktory autentizace

Autentizace probíhá pomocí jednoho nebo více faktorů, typicky rozdělených do kategorií:

KategoriePříklady
Něco co víš (knowledge)Heslo, PIN, bezpečnostní otázka
Něco co máš (possession)Telefon, hardwarový klíč (YubiKey), čipová karta
Něco co jsi (inherence)Otisk prstu, Face ID, rozpoznávání hlasu
Něco co dělášVzor podpisu, vzorec klepání na klávesnici
Kde jsiGeolokace, IP adresa, důvěryhodná síť

1FA, 2FA, MFA

PopisBezpečnost
1FAJediný faktor (typicky heslo)Slabá, závisí na síle hesla
2FADva různé faktoryVýrazně lepší
MFADva a více faktorůNejlepší, často s biometrií

Důležité: "Dva nezávislé faktory" znamená z různých kategorií. Heslo + PIN je pořád 1FA (oboje "něco co víš"). Heslo + SMS kód je 2FA (něco co víš + něco co máš).

Praktické 2FA/MFA metody

MetodaPopisBezpečnost
SMS kódKód přijde na telefonNejslabší (SIM swap útok, SS7)
E-mailový odkazKlik na link v mailuSlabé (úniky e-mailových účtů)
TOTP (Time-based OTP)Aplikace (Google Auth, Authy, 1Password) generuje 6 číslic, mění se každých 30 sekundDobré, doporučené
Push notifikaceKlepnutí na "ANO" v appce (Microsoft Authenticator, Duo)Dobré, ale citlivé na MFA fatigue
BiometrieOtisk prstu, Face IDSkvělé, ale jen pokud lokální (ne posláno na server)
Hardwarový klíčYubiKey, Titan Key přes USB/NFCNejlepší, odolné i proti phishingu
PasskeyKryptografický klíč v zařízení (WebAuthn/FIDO2)Nejlepší, budoucnost

MFA fatigue (útok)

Pokud appka posílá push "ANO/NE" notifikace, útočník může spammovat přihlášení desítkami requestů. Unavený uživatel nakonec klepne "ANO" a útočník je uvnitř. Stalo se Uberu (2022). Řeší se přidáním number matching (uživatel musí zadat číslo, které vidí na webu).

Hesla

Bezpečné ukládání hesel: hashování + salt

Hesla se nikdy neukládají v čistém textu. Místo toho se ukládá jejich hash.

json
Uživatel zadá:  "heslo123"
Systém uloží:   "$2b$10$N9qo8uLOickgx2ZMRZoMye..." (bcrypt hash se saltem)

Při přihlášení:

  1. Systém vezme zadané heslo + uložený salt
  2. Spočítá hash
  3. Porovná s uloženým hashem
  4. Pokud shoda → přístup povolen

Co je salt a proč je kritický

Salt je náhodný řetězec, který se přidá k heslu před hashováním.

Bez saltu:

json
heslo "password" → hash "5e884898da..."   ← stejný pro všechny
heslo "password" → hash "5e884898da..."   ← stejný hash znamená stejné heslo!

Útočník, který získá databázi hashů, může:

  • Rainbow tables: předem spočítané hash hodnoty pro běžná hesla
  • Identifikovat duplicitní hesla: stejný hash = stejné heslo, prozradí to vzorce

Se saltem:

json
heslo "password" + salt "abc123" → hash "f4a92..." 
heslo "password" + salt "xyz789" → hash "e2c8b..."   ← jiný hash!

Každý uživatel má vlastní unikátní salt, který se ukládá vedle hashe. Rainbow tables se stávají k ničemu (musely by se přepočítat pro každý salt zvlášť).

Pepper (volitelně): další secret string, ukládaný mimo databázi (v aplikační konfiguraci). Pokud útočník získá DB ale ne config, ani salt mu nepomůže.

Algoritmy pro hashování hesel

Hashy obecných souborů (SHA-256, MD5) jsou navrženy aby byly rychlé. To je pro hesla špatně, protože útočník pak může za sekundu zkusit miliardy kombinací.

Algoritmy pro hashování hesel jsou záměrně pomalé a často náročné na paměť:

AlgoritmusRokCharakteristika
bcrypt1999Klasika, dodnes OK, ale neumí náročnost na paměť
scrypt2012Náročný na paměť (memory-hard), bránit ASIC útokům
Argon22015Vítěz Password Hashing Competition, dnešní doporučení
PBKDF22000NIST standard, slabší proti GPU útokům

Best practices pro hesla

Doporučení (NIST 2017+)Proč
Délka > komplexita"correct horse battery staple" je silnější než "P@ssw0rd!"
Min 8 znaků, lépe 12+Délka exponenciálně ztěžuje brute force
Žádné nucené pravidelné změnyVede k slabším heslům ("Heslo1!", "Heslo2!"...)
Kontrola proti známým únikůmAPI jako "Have I Been Pwned" zachytí kompromitovaná hesla
Žádné security questions"Jméno první školy" je dohledatelné
Password managerGeneruje a pamatuje silná unikátní hesla

Útoky na hesla

ÚtokPrincipObrana
Brute forceZkoušet všechny kombinacePomalý hash, rate limiting, captcha
Dictionary attackZkoušet běžná hesla ze seznamuStejné jako brute force
Rainbow tablesPředem spočítané hasheSalt
Credential stuffingZkoušet hesla uniklá odjinud2FA, kontrola proti HIBP
PhishingFalešná přihlašovací stránka2FA, hardwarový klíč, Passkey
KeyloggerZáznam stisků klávesAntivir, 2FA
Shoulder surfingSledování při zadáváníSoukromí, automatické zhasínání
Man-in-the-middleOdposlech komunikaceHTTPS, certifikát pinning

Session-based vs token-based autentizace

image.png

Srovnání

Session-basedToken-based (JWT)
Stav na serveruAno (DB nebo paměť)Ne
OdhlášeníTrivální (smaž session)Komplikované (token platí do expirace)
ŠkálovatelnostHorší (sticky sessions, sdílená DB)Lepší (stateless)
Cross-domainKomplikované (cookies + CORS)Snadné (header)
Mobile appsMéně přirozenéStandard
RevokaceOkamžitáPotřebuje blacklist nebo krátkou expiraci

V praxi se často kombinují: short-lived JWT access token + dlouhodobý refresh token uložený v HttpOnly cookie.

Token a JWT

Co je token

Po úspěšném přihlášení server vydá uživateli token: dočasný digitální klíč, který slouží jako důkaz "Jsem přihlášen". Klient ho posílá místo hesla při každém requestu.

Bez tokenu (špatně): Každý request → posílej heslo → útočník odposlechne → katastrofa

S tokenem (správně): Login → server vydá token s krátkou expirací Každý request → Authorization: Bearer <token> Token vyprší → potřeba refresh nebo nový login

JWT (JSON Web Token)

Specifický formát tokenu, který je sám sebou důkazem: data jsou v něm a podepsaná. Server nemusí dělat DB lookup, stačí ověřit podpis.

json
xxxxx.yyyyyyy.zzzzz
  │      │      │
Header Payload Signature

Struktura

Header (algoritmus)

json
{
  "alg": "HS256",
  "typ": "JWT"
}

Algoritmy: HS256 (HMAC, sdílený secret), RS256 (RSA, asymetrické), ES256 (ECDSA).

Payload (data o uživateli)

json
{
  "sub": "user_123",          // subject (ID uživatele)
  "iss": "https://example.com", // issuer (vydavatel)
  "aud": "moje-aplikace",     // audience (pro koho)
  "exp": 1718000000,          // expiration (Unix timestamp)
  "iat": 1717996400,          // issued at
  "role": "admin"             // libovolné vlastní claims
}

Standardní claims: sub, iss, aud, exp, iat, nbf (not before), jti (JWT ID).

Signature (podpis)

jsx
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

Klíčové vlastnosti JWT

VlastnostImplikace
Podpis nelze padělat bez znalosti tajného klíčeMůžeš věřit obsahu
Payload je Base64 kódovaný, ne šifrovanýKdokoli ho přečte (jen Base64)
Obsahuje expiraci (exp)Po vypršení nevalidní
Self-containedServer nemusí dělat DB lookup

Bezpečnostní pasti JWT

PastCo se stane
Algorithm "none"Pokud server akceptuje alg: none, útočník pošle nepodepsaný token a server mu věří
Slabý secretBrute force secretu na offline, padělání tokenů
Žádná expiraceZtracený token platí navždy
Žádná revokacePo krádeži musíš čekat na expiraci nebo invalidovat všechny tokeny změnou secretu
StorageLocalStorage je zranitelný na XSS, HttpOnly cookies na CSRF (řeší SameSite)

Access token + Refresh token

TokenTypŽivotnost
Access tokenJWT, posílaný s requestyKrátká (15 minut)
Refresh tokenRandom string, jen pro obnovuDlouhá (dny/týdny)

Access token vyprší → klient pošle refresh token → server vydá nový access token

OAuth 2.0 a OAuth 2.1

Co OAuth řeší

OAuth 2.0 je standardizovaný protokol pro delegovaný přístup. Aplikace získá omezený přístup k datům uživatele v jiné službě, aniž by se dozvěděla jeho heslo.

Příklad: Aplikace pro úpravu fotek chce přístup k Google Photos. OAuth umožní přístup jen k fotkám, ne k celému Google účtu (mailu, kalendáři, atd.).

Důležité: OAuth NENÍ autentizační protokol. Je to autorizační protokol pro přístup k API. Pro autentizaci slouží OpenID Connect postavený nad OAuth (viz dál).

Role v OAuth 2.0

RolePopis
Resource OwnerUživatel, který vlastní data a uděluje přístup
ClientAplikace, která žádá o přístup
Authorization ServerServer, který ověřuje uživatele a vydává tokeny
Resource ServerServer, kde jsou chráněná data uložena

image.png

Důležité pojmy

PojemPopis
Access TokenKrátkodobý token pro přístup k datům (obvykle JWT)
Refresh TokenDlouhodobý token pro obnovení Access Tokenu
ScopeRozsah přístupu (read:photos, write:posts)
StateAnti-CSRF parametr, klient si ho ověří v callbacku
PKCEProof Key for Code Exchange, ochrana pro public clients

OpenID Connect (OIDC)

OpenID Connect je identitní vrstva nad OAuth 2.0. Řeší autentizaci, zatímco OAuth řeší autorizaci.

OAuth 2.0OpenID Connect
ŘešíAutorizaci (co smíš)Autentizaci (kdo jsi)
TokenAccess Token (typicky opaque)+ ID Token (JWT s identitou)
VýsledekPřístup k APIPotvrzená identita uživatele

OIDC přidává ID Token: JWT obsahující informace o uživateli:

json
{
  "sub": "user_123",
  "iss": "https://accounts.google.com",
  "aud": "moje-aplikace.cz",
  "exp": 1718000000,
  "iat": 1717996400,
  "name": "axo",
  "email": "axo@ax4.cz",
  "email_verified": true,
  "picture": "https://lh3.googleusercontent.com/..."
}

Standardní scopes v OIDC

ScopeCo poskytuje
openidPovinný, aktivuje OIDC
profileJméno, příjmení, fotka, locale
emailE-mail + email_verified
addressAdresa
phoneTelefon

Sociální přihlašování (Third-party autentizace)

"Přihlásit se přes Google / Facebook / Apple / GitHub" je OAuth 2.0 + OpenID Connect.

PlusyMínusy
Pohodlné pro uživateleZávislost na třetí straně
Žádná nová heslaSdílení dat s velkými platformami
Méně přihlašovacích údajů ke správěPokud Google zruší účet, nemůžeš se přihlásit
Vyšší míra ověřených e-mailůSingle point of failure

Sign in with Apple

Apple vyžaduje, aby aplikace s Google/Facebook loginem nabízely i Apple Sign In (na iOS). Apple navíc nabízí Hide My Email: vygeneruje proxy adresu, takže aplikace nezná tvůj reálný e-mail.

Bezheslové přihlašování a Passkeys

Místo hesla aplikace pošle odkaz na e-mail. Kliknutí na odkaz přihlásí. Vhodné pro málo časté přihlášení, ale závisí na bezpečnosti e-mailu.

One-time codes

Aplikace pošle 6místný kód na telefon nebo e-mail. Slabší než magic link kvůli kratšímu kódu.

Passkeys (FIDO2 / WebAuthn)

Moderní standard, který nahrazuje hesla kryptografií. Soukromý klíč nikdy neopustí zařízení.

Jak to funguje

image.png

Proč jsou Passkeys lepší než hesla

HeslaPasskeys
Sdílíš stejné mnohokrátKaždý web vlastní pár klíčů
Phishing riziko (zadáš na falešný web)Nemožný phishing (klíč je vázaný na doménu)
Únik DB = problémÚnik DB = veřejné klíče nikomu nepomohou
Pamatuješ si jeSpravované zařízením/password managerem
Slabé/silnéVždy maximálně silné (256+ bitů entropy)

Terminologie

PojemCo znamená
FIDO2Standardová sada (alliance FIDO)
WebAuthnWeb API pro FIDO2 v prohlížečích (W3C)
CTAPProtokol mezi prohlížečem a hardwarovým klíčem
PasskeyMarketingový termín pro WebAuthn credentials, často synchronizované přes cloud

Sync vs hardware-only

  • Synced passkeys: iCloud Keychain, Google Password Manager, 1Password. Sdílí se mezi tvými zařízeními.
  • Device-bound: hardwarový klíč jako YubiKey. Nesynchronizuje, klíč se nikdy nedostane ven.

Co kdo podporuje (květen 2026)

  • Apple: iCloud Keychain napříč iOS/macOS, podpora od 2022
  • Google: napříč Android/Chrome, podpora od 2023
  • Microsoft: Windows Hello + Microsoft Account, podpora od 2023
  • Velké servery: Google, Microsoft, Apple, GitHub, X, Amazon, eBay, PayPal a desítky dalších

SSO (Single Sign-On)

SSO umožňuje uživateli přihlásit se jednou a pak přistupovat k mnoha různým aplikacím bez opakovaného přihlašování. Typické v firmách: jednou se přihlásíš do Microsoft Entra ID (dřív Azure AD) a máš přístup do Teams, SharePointu, Outlooku, GitHubu Enterprise atd.

SSO protokoly

ProtokolPoužití
OpenID ConnectModerní, OAuth-based, hlavně B2C
SAML 2.0Starší, XML-based, enterprise SSO
KerberosKlasický enterprise (AD), interní sítě

IdP a SP

  • Identity Provider (IdP): ověřuje uživatele (Google, Microsoft, Okta, Auth0)
  • Service Provider (SP): aplikace, kterou chceš použít (Slack, Notion)

Když se chceš přihlásit do Slacku přes firemní Microsoft, Slack přesměruje na Microsoft, ten ověří a vrátí token. Slack tě přihlásí.

Tipy pro ústní zkoušku

Jak začít

"Ověřování identity online stojí na tří fázích: identifikace (kdo jsi), autentizace (opravdu jsi to ty) a autorizace (co smíš). Klasický model je heslo plus session, modernější přístup používá tokeny jako JWT a delegované protokoly OAuth 2.0 a OpenID Connect. Nejmodernější přístup jsou Passkeys, které úplně nahrazují hesla kryptografií."

Co komise typicky chce slyšet

  • Identifikace vs autentizace vs autorizace s konkrétním příkladem.
  • 2FA a kategorie faktorů (co víš/máš/jsi).
  • Hashování hesel (NIKDY plain text, bcrypt/Argon2, se saltem).
  • JWT struktura (header.payload.signature) a že je podepsaný, ne šifrovaný.
  • OAuth vs OpenID Connect rozdíl (autorizace vs autentizace).
  • Sociální login jako kombinace OAuth + OIDC.

Doplňky, které komisi potěší

  • Salt a proč brání rainbow tables.
  • PKCE jako moderní rozšíření OAuth pro SPA a mobilní aplikace.
  • OAuth 2.1 (revize z 2024-2025) deprecates Implicit a Password flow.
  • Passkeys jako WebAuthn/FIDO2, anti-phishing vlastnost.
  • JWT není šifrovaný, jen podepsaný (klasický chyták).
  • MFA fatigue jako moderní útok.
  • Hashing vs encryption rozdíl.

Časté chytáky

OtázkaOdpověď
Rozdíl autentizace a autorizace?Autentizace ověří identitu (kdo jsi), autorizace povolí akci (co smíš).
Je JWT šifrovaný?Ne, je podepsaný. Payload je Base64 kódovaný a kdokoli ho přečte. Pro šifrování existuje JWE.
Co je salt?Náhodný řetězec přidaný k heslu před hashováním. Brání rainbow table útokům.
Proč ne SHA-256 pro hesla?SHA-256 je rychlý, navržený pro integrity check. Hesla potřebují pomalý hash (bcrypt, Argon2) proti brute force.
Rozdíl OAuth 2 a OpenID Connect?OAuth řeší autorizaci (co smíš v API). OIDC přidává autentizaci (kdo jsi).
Co je 2FA?Autentizace dvěma různými faktory. Heslo + SMS je 2FA, heslo + PIN není (oboje "co víš").
Co je phishing-resistant?Metody, které nelze obejít falešnou stránkou. Passkeys ano, SMS kód ne, hardwarový klíč ano.
Co je Refresh Token?Dlouhodobý token pro získání nového Access Tokenu bez opakovaného přihlášení.