2FA a bezpečná hesla – jak zabezpečit účty vývojáře
Správce hesel, TOTP, hardwarové klíče a passkeys. Jak zabezpečit GitHub, e-mail a server, a jak správně implementovat 2FA ve vlastní aplikaci.
Účet vývojáře je pro útočníka cennější než účet běžného uživatele. Přes váš GitHub se dá podstrčit kód do produkce, přes e-mail resetovat všechno ostatní a přes SSH klíč dostat na server. Tento článek má dvě části: jak zabezpečit vlastní účty a jak správně udělat 2FA ve vaší aplikaci.
Část 1: vaše vlastní účty
Správce hesel je základ
Pravidlo „každá služba má jiné heslo“ je bez správce hesel nedodržitelné. Použijte například Bitwarden, 1Password, KeePassXC (offline) nebo správce vestavěného do prohlížeče či systému.
- Generujte náhodná hesla o délce alespoň 16–20 znaků.
- Hlavní heslo správce volte jako passphrase – několik náhodných slov, např.
kolo-mrak-sedm-lampa-vydra. Délka je důležitější než speciální znaky. - Hlavní heslo nepoužívejte nikde jinde.
Je vaše heslo v nějakém úniku? Služba Have I Been Pwned umí kontrolu přes k-anonymitu – posíláte jen prvních 5 znaků SHA-1 hashe:
HASH=$(printf '%s' 'moje-heslo' | sha1sum | awk '{print toupper($1)}')
curl -s "https://api.pwnedpasswords.com/range/${HASH:0:5}" | grep "${HASH:5}"
Pokud příkaz něco vypíše, heslo se objevilo v únicích a nepoužívejte ho. (Pozor, heslo zůstane v historii shellu – pro skutečná hesla použijte raději funkci správce hesel.)
Druhý faktor: od nejslabšího po nejsilnější
| Metoda | Ochrana proti phishingu | Poznámka |
|---|---|---|
| SMS | Ne | Riziko SIM swap, ale lepší než nic |
| TOTP aplikace (Aegis, 2FAS, Google Authenticator…) | Ne | Kód lze vylákat falešnou stránkou |
| Push notifikace | Částečně | Pozor na „únavu“ z opakovaných žádostí |
| Hardwarový klíč (FIDO2/WebAuthn, např. YubiKey) | Ano | Vázán na doménu, falešná stránka ho nepoužije |
| Passkeys | Ano | WebAuthn bez hesla, synchronizované mezi zařízeními |
Kde to jde, používejte passkeys nebo hardwarový klíč. Mějte vždy dva klíče nebo záložní metodu, jinak při ztrátě přijdete o přístup.
Záchranné kódy
Při zapnutí 2FA dostanete záchranné (recovery) kódy. Uložte je do správce hesel nebo vytiskněte a schovejte. Nikoli do souboru na ploše.
Priority pro vývojáře
- E-mail – přes něj jde resetovat většina ostatních účtů.
- GitHub / GitLab – 2FA, ideálně passkey. Zkontrolujte Settings → Sessions a Applications.
- Registrátor domény a DNS – převzetí domény je katastrofa.
- Cloud / hosting a platební brány.
- Správce balíčků (npm, PyPI) – pokud publikujete balíčky. PyPI vyžaduje 2FA pro všechny účty.
SSH klíče
Na serveru vypněte přihlašování heslem a používejte klíče. Moderní volba je Ed25519, ideálně chráněný passphrase:
ssh-keygen -t ed25519 -C "notebook-2026"
S hardwarovým klíčem podporujícím FIDO2 můžete mít SSH klíč, který bez fyzického dotyku nefunguje (OpenSSH 8.2+):
ssh-keygen -t ed25519-sk
V /etc/ssh/sshd_config:
PasswordAuthentication no
PermitRootLogin prohibit-password
Po změně sudo sshd -t (kontrola syntaxe) a sudo systemctl reload ssh (na některých distribucích sshd). Nové přihlášení vyzkoušejte v druhém terminálu, než zavřete stávající session.
Část 2: 2FA ve vlastní aplikaci
Ukládání hesel
Hesla nikdy neukládejte v čitelné podobě ani rychlými hashi (MD5, SHA-256). Použijte Argon2id, bcrypt nebo scrypt. V PHP stačí vestavěné funkce:
$hash = password_hash($heslo, PASSWORD_ARGON2ID); // nebo PASSWORD_DEFAULT
if (password_verify($zadane, $hash)) { /* OK */ }
Pravidla pro hesla podle NIST
Doporučení NIST SP 800-63B jdou proti dřívějším zvykům:
- Dbejte na délku: aktuální revize (Rev. 4) požaduje minimálně 15 znaků, pokud je heslo jediným faktorem, a 8 znaků v kombinaci s 2FA. Povolte dlouhá hesla (alespoň 64 znaků).
- Nevynucujte kombinace typu „velké písmeno + číslo + znak“.
- Nevynucujte pravidelnou změnu hesla bez důvodu.
- Kontrolujte hesla proti seznamu uniklých a běžných hesel.
TOTP v Pythonu
Knihovna pyotp implementuje TOTP podle RFC 6238:
import pyotp
secret = pyotp.random_base32() # uložit k uživateli (šifrovaně)
uri = pyotp.TOTP(secret).provisioning_uri(
name="[email protected]", issuer_name="MojeAplikace")
# uri převeďte na QR kód (např. knihovnou qrcode)
totp = pyotp.TOTP(secret)
totp.verify(kod_od_uzivatele, valid_window=1) # tolerance ±30 s
Na co nezapomenout:
- Rate limiting – šestimístný kód má jen milion kombinací.
- Jednorázovost – zapamatujte si poslední použitý časový krok, aby šel kód použít jen jednou.
- Recovery kódy – vygenerujte 8–10 jednorázových kódů a ukládejte je hashované, stejně jako hesla.
- Při zapnutí 2FA ověřte první kód, než ho aktivujete – jinak si uživatel může zamknout účet.
Pro WebAuthn/passkeys sáhněte po hotové knihovně (např. py_webauthn, @simplewebauthn/server), protokol je příliš složitý na vlastní implementaci.
Shrnutí
Správce hesel, passkeys nebo hardwarový klíč na e-mail a GitHub, SSH jen s klíči. Ve vlastní aplikaci Argon2id, žádná zbytečná pravidla pro složitost hesel a TOTP s rate limitingem a záchrannými kódy.