Narzędzie do generowania i walidacji haseł
Profesjonalne narzędzie do generowania i walidacji haseł, które tworzy silne hasła i zapamiętywalne frazy hasłowe, obsługujące generowanie wsadowe, gwarancję wyjątkowości, ocenę siły oraz walidację polityki. Oferuje kryptograficznie bezpieczne źródło losowości, konfigurowalne zbiory znaków, filtrowanie podobnych znaków, statystyki deduplikacji wsadowej oraz funkcję kopiowania jednym kliknięciem. Zawiera wielojęzyczne przykłady kodu, bazę wiedzy o hasłach, najlepsze praktyki bezpieczeństwa oraz narzędzia do testowania polityk. Wszystkie operacje są wykonywane lokalnie w przeglądarce, co gwarantuje prywatność i bezpieczeństwo.
Test Polityki Hasła
- Długość
- Małe litery
- Duże litery
- Cyfry
- Symbole
- Sekwencyjne
- Powtórzenia
- Blokada
Generator Frazy Hasła
Ściągawka dotycząca hashowania haseł
- Użyj Argon2id z rozsądnymi parametrami wymagającymi zasobów pamięciowych
- Czas ≥ 2 przebiegi, pamięć ≥ 64 MB (dostosuj do środowiska)
- Przechowuj unikalną sól dla każdego użytkownika; opcjonalnie użyj peperu na warstwie aplikacji
- Wybierz SHA-256 lub SHA-512 z iteracjami ≥ 210 tys. (dostosuj w razie potrzeby)
- Użyj unikalnej soli dla każdego hashu; obsługuj aktualizacje parametrów
- Przeprowadź migrację na parametry wyższego kosztu podczas następnego logowania użytkownika
- Ustaw koszt na 10–14, w zależności od możliwości serwera
- Unikaj problemów z przycinaniem hasła; zahashuj całe hasło
- Zaimplementuj ograniczanie szybkości i monitorowanie na punktach końcowych autentykacji
Evaluator Siły Hasła
Siła jest przybliżana przez entropię: entropia = log2(rozmiar zbioru znaków) × długość. Większy zbiór znaków i dłuższa długość zwiększają odporność na odgadywanie.
- Słabe: < 50 bitów —— Nadaje się tylko do scenariuszy jednorazowych lub o niskiej wartości
- Umiarkowane: 50–80 bitów —— Akceptowalne dla scenariuszy o niskim ryzyku
- Silne: 80–110 bitów —— Zalecany domyślny cel
- Bardzo silne: > 110 bitów —— Zalecane dla kont administratorów lub kont krytycznych
Uwaga: Modele ataków w rzeczywistości mogą się różnić; unikaj ponownego używania haseł i włącz uwierzytelnianie wieloskładnikowe (MFA).
Jak używać
- Wybierz długość i zbiór znaków (małe/wielkie litery/ cyfry/symbole); opcjonalnie włącz opcje: unikaj podobnych znaków i wymagaj każdego typu
- Aby uzyskać większą kontrolę: wyklucz określone znaki lub grupy znaków, lub wybierz podzbiory symboli
- Wybierz, ile haseł chcesz wygenerować, a następnie kliknij „Generuj”; wyniki zbiorcze są automatycznie usuwane z duplikatów i można je skopiować jednocześnie
- Aby walidować istniejące hasła, użyj Testera Polityki; aby uzyskać zapamiętywalne frazy hasłowe, użyj Generatora Fraz Hasłowych
Funkcje
- Kryptograficznie bezpieczne źródło losowości (Web Crypto)
- Konfigurowalne zbiory znaków i grupy symboli
- Filtrowanie podobnych znaków i niestandardowe wykluczenia
- Generowanie partii od 1 do 100 haseł, zawsze unikalnych
- Metryki siły i entropii
- Tester Polityki i Generator Fraz Hasłowych
- Wielojęzyczne przykłady kodu
- Kopiowanie jednym kliknięciem (pojedyncze lub wszystkie)
Baza wiedzy o hasłach
- Entropia ≈ log2(rozmiar zbioru znaków) × długość; długość zwykle ma większy wpływ
- Zalecane wartości docelowe: Konta ogólnego przeznaczenia ≥ 80 bitów; Konta o wysokich uprawnieniach/ finansowe ≥ 110 bitów
- Większy zbiór znaków + dłuższa długość → większa odporność na zgadywanie
- Ślepe dodawanie symboli jest mniej efektywne niż zwiększanie długości
- Unikaj przewidywalnych wzorców (np. zawsze 'Wielka litera na początku + cyfra na końcu!')
- Priorytetuj odpowiednią długość, a następnie umiarkowanie zwiększaj różnorodność znaków
- Sekwencje klawiatury (np. qwerty), powtarzające się bloki, daty urodzin/lata są łatwo atakowane przez reguły
- Użycie 'głównego hasła + sufiks witryny' tworzy powtarzanie wariantów, skupiając ryzyko i ułatwiając zgadywanie haseł
- Nigdy nie używaj tego samego hasła na wielu stronach internetowych
- Używaj menedżera haseł; zapewnij unikalne hasła dla każdej strony; włącz MFA dla kluczowych kont
- Unikaj transmisji haseł w postaci jawnej przez publiczne kanały; w razie potrzeby używaj 'wymawialnych' fraz hasłowych
- Natychmiast zmień i unikalizuj hasła, jeśli wykryjesz ich wyciek lub powtórzenie
- Kombinacje 4–6 losowych słów są zazwyczaj silne i zapamiętywalne
- Mieszaj separatory, stosuj wielkie litery na początku oraz wstawiaj liczby, aby zwiększyć siłę i czytelność
- Unikaj bezpośredniego łączenia popularnych fraz, tekstów piosenek lub znanych cytatów
Najlepsze praktyki bezpieczeństwa haseł
- Zapewnij wystarczającą długość: 16+ znaków dla zwykłych kont, 24+ dla kont krytycznych
- Aby hasło było łatwe do zapamiętania, wybieraj frazy hasłowe; używaj menedżera haseł do przechowywania losowych, silnych haseł
- Włączaj uwierzytelnianie wieloskładnikowe (MFA) zawsze, gdy to możliwe
- Nigdy nie używaj tych samych haseł w różnych serwisach – każde konto powinno mieć unikalne hasło
Entropia mierzy nieprzewidywalność na podstawie długości i wielkości zbioru znaków – im więcej bitów entropii, tym silniejsze jest zazwyczaj hasło
- Priorytetem powinno być zwiększanie długości, aby uzyskać maksymalny wzrost siły hasła
- Stosuj wiele zbiorów znaków, gdy jest to wykonalne
- Zbyt wiele wykluczonych znaków zmniejsza pulę znaków i osłabia siłę hasła
- Preferuj wymagania dotyczące długości i czarne listy popularnych/uciekinionych haseł zamiast skomplikowanych reguł składni
- Unikaj częstych obowiązkowych rotacji; zmieniaj hasło tylko wtedy, gdy wykryto naruszenie lub ryzyko
- Używaj list skompromitowanych haseł, aby blokować powszechnie używane lub uciekinione hasła
- Używaj 4–6 losowych słów połączonych separatorami, np. jezioro-MARCHEW- planeta_7
- Unikaj znanych cytatów, tekstów piosenek lub innych popularnych fraz; losowość jest ważniejsza od „genialności”
- W przypadku kont krytycznych używaj menedżera haseł do przechowywania naprawdę wysokiej jakości, losowych haseł
- „Wymagaj każdego wybranego zbioru” gwarantuje, że co najmniej jeden znak z każdej wybranej kategorii pojawi się w haśle
- „Unikaj podobnych” poprawia czytelność, ale lekko zmniejsza rozmiar puli znaków
- Symbole mogą być ograniczone do podzbioru obsługiwanego przez docelowy system
- Nigdy nie przechowuj haseł w postaci jawnej; używaj silnych funkcji haszujących (Argon2id/PBKDF2/Bcrypt) z solą
- Skonfiguruj parametry (pamięć/czas/koszt) odpowiednio; w razie potrzeby rozważ użycie pieprzu
- Ogranicz liczbę prób logowania i monitoruj niepowodzenia; stosuj CAPTCHA lub weryfikację urządzenia podczas ataków
- Preferuj TOTP lub klucze sprzętowe; unikaj SMS zawsze, gdy to możliwe
- Zabezpiecz procesy odzyskiwania za pomocą uwierzytelniania wieloskładnikowego lub weryfikacji e-mail oraz wymuszaj okresy ochładzania
- Dostarczaj kopie zapasowe kodów odzyskiwania i zachęcaj użytkowników do bezpiecznego ich przechowywania
- Implementuj progresywne opóźnienia lub blokady z oceną ryzyka IP/urządzenia
- Stosuj WAF i ograniczanie szybkości dla interfejsów API i formularzy logowania
- Monitoruj ataki typu credential stuffing i zachęcaj użytkowników do stosowania unikalnych haseł
- Używaj renomowanego menedżera haseł do przechowywania i automatycznego wypełniania
- Nigdy nie udostępniaj haseł w postaci jawnej przez czat lub e-mail; używaj narzędzi do zarządzania sekretami dla zespołów
- Jeśli zapisujesz hasła offline, zapewnij ich fizyczne bezpieczeństwo
Jak generować hasła za pomocą języków programowania
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');
// Rejection sampling removes modulo bias
const limit = Math.floor(0x100000000 / pool.length) * pool.length;
const buf = new Uint32Array(1);
let out = '';
for (let i = 0; i < length; i++) {
do { crypto.getRandomValues(buf); } while (buf[0] >= limit);
out += pool[buf[0] % pool.length];
}
return out;
}
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))
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;
}
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
}
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();
}
}
using System;
using System.Security.Cryptography;
public static class Pw {
public static string RandomPassword(int length, string pool) {
// GetInt32 draws an unbiased value in [0, pool.Length)
var chars = new char[length];
for (int i = 0; i < length; i++) {
chars[i] = pool[RandomNumberGenerator.GetInt32(pool.Length)];
}
return new string(chars);
}
}
use rand::rngs::OsRng;
use rand::Rng;
fn random_password(length: usize, pool: &str) -> String {
// gen_range is uniform, so there is no modulo bias
let chars: Vec = pool.chars().collect();
(0..length)
.map(|_| chars[OsRng.gen_range(0..chars.len())])
.collect()
}
fn main() {
let pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
let pw = random_password(16, pool);
println!("{}", pw);
}