Nástroj na generování a ověřování hesel
Generujte silná hesla a heslové fráze, podporujte hromadné, jedinečné, silové a strategické ověřování a získejte kódy v různých jazycích a užitečné informace.
Generátor hesel
Počet
Vyberte skupiny symbolů
×
Tip: Vyloučení lze provést výběrem skupiny nebo přímým kliknutím na znak.
Výsledek
Entropie
Síla:
Vygenerováno
položek
-
#
Duplikáty:
(Požadováno ,
Unikátních
)
Nenalezeno dostatek unikátních kombinací; snižte počet nebo rozšiřte znakovou sadu.
Entropie
Síla:
Testovač zásad hesel
Výsledky
- Délka
- Malá písmena
- Velká písmena
- Číslice
- Symboly
- Po sobě jdoucí posloupnosti
- Opakování
- Černá lista
Všechny kontroly jsou prováděny místně ve vašem prohlížeči.
Generátor heslových frází
Slova jsou vybírána pomocí bezpečného náhodného generátoru (Web Crypto). Ukázkový seznam slov je kvůli omezení velikosti krátký.
Rychlá příručka hashování hesel
Argon2id
- Použijte Argon2id s přiměřenými parametry paměti
- Iterace ≥ 2, paměť ≥ 64 MB (přizpůsobte podle prostředí)
- Samostatný sol pro každého uživatele; volitelně použijte pepper na úrovni aplikace
PBKDF2
- Vyberte SHA-256 nebo SHA-512 s iteracemi ≥ 210k (přizpůsobte podle potřeb)
- Jedinečný sol pro každý hash; podporuje aktualizaci parametrů
- Při dalším přihlášení uživatele převeďte na vyšší náročné parametry
BCrypt
- Náklad 10–14, podle výkonu serveru
- Vyhněte se řezání hesel; hashujte celé heslo
- Implementujte limity a monitorování pro auth endpointy
Reference: NIST SP 800-63B, OWASP ASVS. Parametry musí odpovídat hardwarovým možnostem a SLO.
Hodnocení síly hesla
Síla je odhadována na základě entropie: entropy = log2(velikost znakové sady) × délka. Větší znaková sada a delší délka zvyšují odolnost proti hrubé síle.
- Slabé: < 50 bitů —— vhodné pouze pro jednorázové nebo nízko-hodnotové scénáře
- Průměrné: 50–80 bitů —— přijatelné pro scénáře s nízkým rizikem
- Silné: 80–110 bitů —— doporučený cíl výchozího nastavení
- Výborné: > 110 bitů —— vhodné pro správce nebo kritické účty
Poznámka: Skutečné modely útoků se mohou lišit; vyhýbejte se opakování hesel a zapněte dvoufaktorovou autentizaci (MFA).
Použití
- Vyberte délku a sadu znaků (malá písmena / velká písmena / číslice / symboly); případně zapněte „Vyloučit podobné“ a „Vyžadovat každý“
- Pro jemnější kontrolu: vylučte konkrétní znaky nebo skupiny znaků nebo vyberte skupiny symbolů
- Klikněte na generování; pokud potřebujete více výsledků, zapněte hromadné generování a jedním kliknutím zkopírujte všechny
- Chcete-li ověřit existující heslo, použijte „Testovač strategie“; chcete-li snadno zapamatovatelnou frázi, použijte „Generátor heslových frází“
Funkce
- Bezpečný náhodný zdroj (Web Crypto)
- Konfigurovatelné sady znaků a skupiny symbolů
- Filtrace podobných znaků a vlastní vyloučení
- Hromadné generování, zajištění jedinečnosti a statistika odstranění duplicit
- Hodnocení síly a entropie
- Testovač strategie a generátor heslových frází
- Příklady kódu v různých jazycích (JS、Python、PHP、Go、Java、C#、Rust)
- Kopírování jedním kliknutím (jedno heslo / všechna)
Báze znalostí o heslech
1) Síla hesla a entropie
- Entropie ≈ log2(velikost sady znaků) × délka; příspěvek délky je obvykle větší
- Doporučený cíl: běžné účty ≥ 80 bitů; účty s vysokými oprávněními / finanční ≥ 110 bitů
- Větší sada znaků + delší délka → vyšší odolnost proti odhadování
2) Délka vs. složitost
- Slepé přidávání symbolů je méně účinné než zvýšení délky
- Vyhněte se pevným, předvídatelným vzorům (např. vždy „velké první písmeno + číslo na konci!“)
- Nejprve zajistěte dostatečnou délku, pak mírně zvyšujte různorodost znaků
3) Běžné chyby a anti-patterny
- Klávesnicové posloupnosti (qwerty), opakující se bloky, datum narození/rok atd. jsou snadno odhalitelné podle pravidel
- „Hlavní heslo + přípona webu“ je variace s opakováním, což vytváří soustředěné riziko a usnadňuje uhodnutí
- Nepoužívejte stejné heslo na více webech
4) Doporučení pro správu hesel
- Používejte správce hesel; jedinečné heslo pro každou stránku; pro důležité účty zapněte MFA
- Nepřenášejte hesla v čitelné podobě veřejnými kanály; při nutnosti použijte „přátelská k vyřečení“ hesla
- Pokud zjistíte únik nebo opakování, okamžitě změňte heslo a zajistěte jeho jedinečnost
5) Průvodce pro fráze hesel (Passphrase)
- Kombinace 4–6 slov je obvykle silná a snadno si zapamatovatelná
- Smíchejte oddělovače, velká písmena na začátku slov a vložte čísla pro zvýšení síly a přehlednosti
- Vyhněte se přímému spojení běžných frází, textů písní nebo citátů
Průvodce bezpečnými praktikami pro hesla
Nejlepší praktiky
- Používejte co nejdelší hesla: obecné účty 16+ znaků, kritické účty 24+ znaků
- Pro zapamatování preferujte fráze hesel; náhodná silná hesla doporučujeme ukládat do správce hesel
- Zapojte dvoufázovou autentizaci (MFA) tam, kde je to možné
- Nepoužívejte stejné heslo na různých webech — každý účet by měl mít jedinečné heslo
Entropie a síla
Entropie odráží nepředvídatelnost na základě délky a velikosti znakové sady; vyšší počet bitů entropie obvykle znamená vyšší sílu.
- Největší přínos dosáhnete zvětšením délky
- V případě možnosti používejte různé znakové sady
- Přílišné vylučování znaků zmenší znakovou sadu a sníží sílu
Politiky a rotace
- Upřednostňujte délku a černé seznamy běžných/ohrožených hesel před složitými pravidly složení
- Vyhněte se častému nutnému vyměňování; měňte hesla pouze při úniku nebo riziku
- Používejte seznamy ohrožených hesel k blokování běžných/nebezpečných hesel
Fráze hesel
- Použijte 4–6 náhodných slov spojených oddělovačem, např. lake-CARROT-planet_7
- Vyhněte se citátům, textům písní nebo jiným běžným frázím; náhodnost je důležitější než 'genialita'
- Pro kritické účty doporučujeme použít správce hesel pro ukládání skutečně vysokoen tropických náhodných hesel
Tipy pro nastavení generátoru
- "Require each selected set" zajistí, že se každá vybraná skupina objeví alespoň jednou
- "Avoid similar" zvyšuje čitelnost, ale mírně zmenšuje znakovou sadu
- Symboly lze omezit na podmnožinu přijatelnou cílovým systémem
Ukládání na serveru
- Nikdy neukládejte hesla v čitelné podobě; používejte silné hašování (Argon2id/PBKDF2/BCrypt) s solí
- Nastavte parametry (paměť/time/cost) vhodně; při potřebě použijte pepper
- Omezte rychlost přihlašování a sledujte neúspěšné pokusy; při útoku použijte CAPTCHA nebo ověření zařízení
Vícefaktorová autentizace a obnova
- Preferujte TOTP/hardwarové klíče; vyhýbejte se SMS
- Chráněte proces obnovy: vícefaktorové ověření nebo ověření e-mailem s ochranou dobou
- Poskytněte záložní obnovovací kódy a doporučte uživatelům jejich bezpečné uložení
Ochrana proti hrubé síle
- Používejte postupné zpoždění/neblokování a hodnocení rizika IP/zařízení
- Nastavte WAF/omezení rychlosti pro API a formuláře přihlášení
- Sledujte útoky typu credential stuffing a povzbuzujte uživatele k používání jedinečných hesel
Lokální ukládání a zpracování
- Ukládejte a automaticky vyplňujte hesla pomocí spolehlivého správce hesel
- Nesdílejte hesla v čitelné podobě prostřednictvím chatu/e-mailu; pro týmy používejte nástroje pro správu tajenek
- Pokud musíte hesla zaznamenávat ručně, zajistěte fyzickou bezpečnost
Upozornění: Tento nástroj generuje hesla lokálně ve vašem prohlížeči pomocí Web Crypto; žádná data nejsou odesílána na server.
Jak generovat hesla pomocí programovacích jazyků
JavaScript(Web Crypto)
function randomPassword(length = 16, sets = {lower:true, upper:true, digits:true, symbols:true}) {
const pools = {
lower: 'abcdefghijklmnopqrstuvwxyz',
upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
digits: '0123456789',
symbols: '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
};
let pool = '';
for (const k of Object.keys(sets)) if (sets[k]) pool += pools[k];
if (!pool) throw new Error('No charset');
const bytes = new Uint32Array(length);
crypto.getRandomValues(bytes);
let out = '';
for (let i = 0; i < length; i++) out += pool[bytes[i] % pool.length];
return out;
}
Python(secrets)
import secrets
def random_password(length=16, lower=True, upper=True, digits=True, symbols=True):
pools = {
'lower': 'abcdefghijklmnopqrstuvwxyz',
'upper': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'digits': '0123456789',
'symbols': '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
}
pool = ''.join(v for k, v in pools.items() if locals()[k])
if not pool:
raise ValueError('No charset')
return ''.join(secrets.choice(pool) for _ in range(length))
PHP(random_int)
function random_password($length = 16, $sets = ['lower'=>true,'upper'=>true,'digits'=>true,'symbols'=>true]) {
$pools = [
'lower' => 'abcdefghijklmnopqrstuvwxyz',
'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'digits' => '0123456789',
'symbols' => '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
];
$pool = '';
foreach ($sets as $k => $on) if ($on) $pool .= $pools[$k];
if ($pool === '') throw new Exception('No charset');
$out = '';
for ($i = 0; $i < $length; $i++) {
$out .= $pool[random_int(0, strlen($pool)-1)];
}
return $out;
}
Go(crypto/rand)
package main
import (
"crypto/rand"
"math/big"
)
func RandomPassword(length int, pool string) (string, error) {
out := make([]byte, length)
for i := 0; i < length; i++ {
nBig, err := rand.Int(rand.Reader, big.NewInt(int64(len(pool))))
if err != nil { return "", err }
out[i] = pool[nBig.Int64()]
}
return string(out), nil
}
Java(SecureRandom)
import java.security.SecureRandom;
public class Pw {
static final String POOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
static final SecureRandom SR = new SecureRandom();
static String randomPassword(int length) {
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int idx = SR.nextInt(POOL.length());
sb.append(POOL.charAt(idx));
}
return sb.toString();
}
}
C#(.NET RandomNumberGenerator)
using System;
using System.Security.Cryptography;
public static class Pw {
public static string RandomPassword(int length, string pool) {
using var rng = RandomNumberGenerator.Create();
var bytes = new byte[length];
rng.GetBytes(bytes);
var chars = new char[length];
for (int i = 0; i < length; i++) {
chars[i] = pool[bytes[i] % pool.Length];
}
return new string(chars);
}
}
Rust(rand + getrandom)
use rand::rngs::OsRng;
use rand::RngCore;
fn random_password(length: usize, pool: &str) -> String {
let mut bytes = vec![0u8; length];
OsRng.fill_bytes(&mut bytes);
let chars: Vec = pool.chars().collect();
bytes
.iter()
.map(|b| chars[(*b as usize) % chars.len()])
.collect()
}
fn main() {
let pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
let pw = random_password(16, pool);
println!("{}", pw);
}