Bezpečnost
MujVykaz implementuje několik vrstev zabezpečení pro ochranu vašich dat.
Požadavky na heslo
Každé heslo musí splňovat:
| Požadavek | Minimum |
|---|---|
| Délka | 8 znaků |
| Velké písmeno | Alespoň 1 |
| Číslice | Alespoň 1 |
| Speciální znak | Alespoň 1 (!@#$%^&* apod.) |
Hesla jsou hashována moderním algoritmem s vysokými výpočetními náklady (memory-hard function) a nikdy se neukládají v čitelné podobě.
Ověření e-mailu
Po registraci e-mailem musíte potvrdit svou adresu kliknutím na ověřovací odkaz. Bez ověření:
- Nemůžete přistupovat k většině funkcí
- Systém zobrazuje upozornění s možností opětovného odeslání
Správa relací (sessions)
| Parametr | Hodnota |
|---|---|
| Platnost relace | 7 dní |
| Automatické odhlášení | Po 7 dnech neaktivity |
| Souběžné relace | Povoleny (více zařízení) |
Aktivní relace můžete zkontrolovat v Nastavení → Bezpečnost. Pokud vidíte neznámé relace, můžete je ukončit.
Rate limiting
Všechny endpointy jsou chráněny rate limitingem proti brute-force útokům a zneužití:
- Přihlášení, registrace, reset hesla — přísné limity proti automatizovaným útokům
- REST API — 120 požadavků za minutu na API klíč (pro legitimní integrace s dostatečnou rezervou)
- Pozvánky do organizace — 20 pozvánek za hodinu na uživatele/organizaci; 5 pozvánek za hodinu na cílovou e-mailovou adresu (ochrana před enumerací a spamem)
- Ostatní endpointy — limity nastavené podle typu operace
Po překročení limitu se zobrazí chyba 429 Too Many Requests s hlavičkou Retry-After udávající čas do příštího pokusu.
Ochrana proti útoku na heslo (credential stuffing)
Aplikace má vícevrstvou obranu proti automatizovaným pokusům o uhodnutí hesla:
| Vrstva | Limit | Co dělá |
|---|---|---|
| Per IP adresa | 10 pokusů / minutu | Blokuje obvyklý brute-force z jednoho zdroje |
| Per e-mail | 5 pokusů / 15 minut | Zachytí distribuovaný útok přes mnoho IP adres |
| Zámek účtu | 5 neúspěšných pokusů → 15 minut | Účet je dočasně uzamčen — žádné další pokusy nejsou přijaty |
| Dvoufázové ověření | 5 pokusů / 15 minut | Limit pro zadání kódu z autentizační aplikace |
Co když je váš účet zablokován?
Pokud zadáte špatné heslo 5× během 15 minut, účet se automaticky uzamkne na 15 minut. Při dalším pokusu uvidíte chybu:
Účet je dočasně uzamčen z bezpečnostních důvodů. Odemkne se v HH:MM. Pokud si nepamatujete heslo, můžete si ho resetovat.
Co dělat:
- ✅ Resetujte si heslo — kliknutím na "Zapomenuté heslo" na přihlašovací stránce. Po nastavení nového hesla se zámek okamžitě uvolní.
- ✅ Počkejte 15 minut — zámek se automaticky uvolní.
- ✅ Zkontrolujte e-mail — pokud došlo k zámku poprvé za 24 hodin, dostanete bezpečnostní upozornění s detaily a doporučením změnit heslo, pokud jste to nebyli vy.
Pokud používáte přihlášení přes Google účet, tento zámek se na vás nevztahuje — Google má vlastní bezpečnostní mechanismy.
Sdílíte počítač? Pokud váš kolega zkusí přihlášení s vaším e-mailem a špatným heslem, započítá se to do vašeho limitu. V takovém případě dostanete e-mail s upozorněním — doporučujeme změnit heslo a zvážit aktivaci dvoufázového ověření.
Dvoufázové ověření (2FA)
Pro zvýšení bezpečnosti doporučujeme aktivovat dvoufázové ověření (2FA). Po aktivaci budete při přihlášení zadávat kód z autentizační aplikace.
Doporučení
- Aktivujte 2FA pro všechny členy s rolí Admin a Owner.
- Používejte unikátní hesla — nerecyklujte hesla z jiných služeb.
- Pravidelně kontrolujte aktivní relace.
- U API klíčů nastavte minimální potřebná oprávnění (klíče dědí roli uživatele).
Šifrování
- Veškerá komunikace probíhá přes HTTPS/TLS.
- API klíče jsou uloženy jako HMAC-SHA256 hash s pepperem — každý klíč je zabezpečen serverovým tajemstvím, takže kompromitace databáze nestačí k rekonstrukci klíčů.
- Webhook secret klíče se porovnávají pomocí timing-safe comparison pro ochranu proti timing attacks.
- Webhooky jsou chráněny proti SSRF útokům — cílová URL je validována před odesláním požadavku (blokují se privátní IP rozsahy, localhost a IPv6 link-local adresy).
Datová izolace mezi organizacemi
Pokud jste členem více organizací, aplikace přísně odděluje data jedné organizace od druhé:
- Každý záznam (výkaz, projekt, klient, faktura, zpráva, nepřítomnost) patří vždy jedné konkrétní organizaci.
- Přepnutí organizace v levém sidebaru vždy okamžitě izoluje pohled — uvidíte pouze data aktivní organizace.
- API klíče jsou svázané s konkrétní organizací — klíč vytvořený v organizaci A nelze použít pro přístup k datům organizace B.
- Chrome Extension pracuje s tou organizací, ve které byla aktivní, když jste extension připojili.
Pokud přecházíte mezi organizacemi, doporučujeme si ověřit v horním levém rohu aplikace, ve které organizaci aktuálně pracujete. Rozdílné organizace mohou mít různé role, projekty i oprávnění.
Export osobních dat (GDPR Art. 20)
Každý uživatel si může kdykoliv stáhnout všechna svá osobní data v JSON formátu:
Nastavení → Osobní → Export dat → tlačítko Stáhnout moje data.
Export obsahuje:
- Profilové údaje (jméno, e-mail, role)
- Všechny výkazy a jejich popisy (včetně původní doby, měny, částky, aktivity a metadat)
- Interní zprávy
- Notifikace
- API klíče (bez plain-text hodnot — pouze metadata)
- Nepřítomnosti
- Team tagy (přiřazené štítky)
- Audit log vašich vlastních akcí (posledních 365 dní)
Multi-org tagging: pokud jste členem více organizací, každý záznam v exportu obsahuje pole orgId a orgName, abyste mohli identifikovat, z které organizace data pocházejí. Toto je v souladu s GDPR Art. 20 (přenositelnost údajů) — máte právo vědět, kdo je správcem jednotlivých dat.