Wachtwoordgenerator en -validator
Professionele tool voor het genereren en valideren van wachtwoorden die sterke wachtwoorden en memorabele wachtzinnen creëert, met ondersteuning voor batchgeneratie, uniekgarantie, sterktebeoordeling en beleidsvalidatie. Functies zijn onder andere cryptografisch veilige willekeurige bron, configureerbare tekensets, filtering van vergelijkbare tekens, statistieken voor deduplicatie in batches en kopiëren met één klik. Bevat meertalige codevoorbeelden, wachtwoordkennisbank, beste beveiligingspraktijken en tools voor beleidstesten. Alle bewerkingen worden lokaal in uw browser uitgevoerd, wat privacy en beveiliging garandeert.
Wachtwoordgenerator
-
#
Wachtwoordbeleid-tester
- Lengte
- Kleine letters
- Hoofdletters
- Cijfers
- Symbolen
- Opeenvolgend
- Herhalingen
- Geblokkeerde lijst
Wachtzin-generator
Wachtwoord Hashing Cheat Sheet
- Gebruik Argon2id met redelijke geheugen-hard parameters
- Tijd ≥ 2 passes, geheugen ≥ 64MB (afstemmen op omgeving)
- Sla een unieke salt per gebruiker op; gebruik eventueel een pepper op applicatielaag
- Kies SHA-256 of SHA-512 met iteraties ≥ 210k (afstemmen indien nodig)
- Gebruik een unieke salt voor elke hash; ondersteun parameterupgrades
- Migreer naar parameters met hogere kosten bij de volgende aanmelding van de gebruiker
- Stel de kost in op 10–14, afhankelijk van servermogelijkheden
- Vermijd afkortingsproblemen; hash het volledige wachtwoord
- Implementeer snelheidsbeperking en monitoring op authenticatie-eindpunten
Wachtwoordsterkte-evaluator
De sterkte wordt benaderd door entropie: entropie = log2(grootte tekenset) × lengte. Een grotere tekenset en langere lengte verbeteren de weerstand tegen gokken.
- Zwak: < 50 bits —— Alleen geschikt voor eenmalige gebruiksscenario's of scenario's met lage waarde
- Matig: 50–80 bits —— Acceptabel voor risicovolle scenario's
- Sterk: 80–110 bits —— Aanbevolen standaarddoel
- Uitstekend: > 110 bits —— Aanbevolen voor beheerder- of kritieke accounts
Let op: Aanvalsmodellen in de praktijk kunnen verschillen; vermijd hergebruik van wachtwoorden en schakel multi-factor authenticatie (MFA) in.
Gebruiksaanwijzing
- Selecteer lengte en tekenset (Kleine letters/Hoofdletters/Cijfers/Symbolen); schakel eventueel 'Vergelijkbare tekens vermijden' en 'Elk type vereisen' in
- Voor meer controle: sluit specifieke tekens of tekengroepen uit, of kies subsets van symbolen
- Kies hoeveel wachtwoorden je wilt genereren en klik vervolgens op Genereren; batchresultaten worden automatisch gededupliceerd en kunnen in één keer worden gekopieerd
- Gebruik de Beleidstester om bestaande wachtwoorden te valideren; voor memorabele wachtzinnen gebruikt u de Wachtzingenerator
Functies
- Cryptografisch veilige willekeurige bron (Web Crypto)
- Configureerbare tekensets en symboolgroepen
- Filtering van vergelijkbare tekens en aangepaste uitsluitingen
- Batchgeneratie van 1-100 wachtwoorden, altijd uniek
- Sterkte- en entropiemetingen
- Beleidstester en Wachtzingenerator
- Meertalige codevoorbeelden
- Kopiëren met één klik (enkel of alles)
Wachtwoordkennisbank
- Entropie ≈ log2(tekensetgrootte) × lengte; lengte draagt meestal meer bij
- Aanbevolen streefwaarden: Algemene accounts ≥ 80 bits; Accounts met hoge rechten/financiële accounts ≥ 110 bits
- Grotere tekenset + langere lengte → grotere weerstand tegen raden
- Het blind toevoegen van symbolen is minder effectief dan het vergroten van de lengte
- Vermijd voorspelbare patronen (bv. altijd 'Hoofdletter eerste + cijfer aan het eind!' )
- Geef prioriteit aan voldoende lengte, daarna matige toename van tekendiversiteit
- Toetsenvolgorden (bv. qwerty), herhalende blokken, verjaardagen/jaren worden snel getarget door regels
- Gebruik van 'root wachtwoord + sitesuffixed' zorgt voor variantgebruik, concentreert risico en maakt wachtwoorden makkelijker te raden
- Gebruik nooit hetzelfde wachtwoord op meerdere websites
- Gebruik een wachtwoordmanager; zorg voor unieke wachtwoorden per site; schakel MFA in voor kritieke accounts
- Vermijd het versturen van wachtwoorden in platte tekst via openbare kanalen; gebruik 'uitspreekbare' wachtzinnen indien nodig
- Wijzig onmiddellijk en maak wachtwoorden uniek als lekken of hergebruik wordt gedetecteerd
- Combinaties van 4–6 willekeurige woorden zijn meestal sterk en memorabel
- Gebruik scheidingstekens, beginletters met hoofdletters en cijfers om de sterkte en leesbaarheid te verhogen
- Vermijd het direct aaneenrijgen van veelgebruikte zinnen, songteksten of bekende citaten
Beste praktijken voor wachtwoordbeveiliging
- Gebruik voldoende lengte: 16+ tekens voor gewone accounts, 24+ voor kritieke accounts
- Kies wachtwoordzinnen voor het geheugen; gebruik een wachtwoordbeheerder om willekeurige, hoge sterkte wachtwoorden op te slaan
- Schakel indien mogelijk multi-factor authenticatie (MFA) in
- Herhaal nooit wachtwoorden op verschillende sites; elk account heeft een uniek wachtwoord
Entropie meet de onvoorspelbaarheid op basis van lengte en de omvang van het tekenset. Hoe hoger het entropie bits, hoe sterker het wachtwoord meestal is.
- Geef prioriteit aan het verhogen van de lengte voor de grootste sterktewinst
- Gebruik meerdere tekensets indien mogelijk
- Als je te veel tekens uitsluit, wordt de tekenset kleiner en neemt de sterkte af
- Geef de voorkeur aan lengtevereisten en zwarte lijsten van veelgebruikte/gelekte wachtwoorden boven complexe samenstellingsregels
- Vermijd frequente verplichte rotaties; wijzig alleen wanneer een inbreuk of risico wordt gedetecteerd
- Gebruik lijsten van gecompromitteerde wachtwoorden om veelgebruikte of gelekte wachtwoorden te blokkeren
- Gebruik 4–6 willekeurige woorden verbonden door scheidingstekens, bijvoorbeeld: meer-KROKET-planeet_7
- Vermijd bekende citaten, songteksten of andere veelgebruikte zinnen; willekeurigheid is belangrijker dan 'slimheid'
- Gebruik voor kritieke accounts een wachtwoordbeheerder om echt hoge-entropie willekeurige wachtwoorden op te slaan
- 'Vereist elk gekozen set' zorgt ervoor dat er minimaal één teken uit elke gekozen categorie verschijnt
- 'Vergelijkbare vermijden' verbetert de leesbaarheid, maar verkleint de tekenset iets
- Symbolen kunnen beperkt worden tot een subset die door het doelsysteem wordt ondersteund
- Sla nooit wachtwoorden als plaintext op; gebruik sterke hashing (Argon2id/PBKDF2/Bcrypt) met een zout
- Configureer parameters (geheugen/tijd/kosten) op de juiste manier; overweeg gebruik van een peper indien nodig
- Beperk het aantal pogingen om in te loggen en mislukte pogingen te bewaken; pas CAPTCHA of apparaatverificatie toe tijdens aanvallen
- Geef de voorkeur aan TOTP of hardware-sleutels; vermijd SMS indien mogelijk
- Beveilig herstelprocedures met multi-factor of e-mailverificatie en handhaaf wachttijden
- Geef back-up herstelcodes en moedig gebruikers aan deze veilig op te slaan
- Implementeer progressieve vertragingen of vergrendelingen met IP/apparaat risicoscores
- Pas WAF's en snelheidsbeperking toe op API's en aanmeldformulieren
- Houd credential stuffing in de gaten en moedig gebruikers aan unieke wachtwoorden te gebruiken
- Gebruik een gerenommeerde wachtwoordbeheerder voor opslag en automatisch invullen
- Deel nooit wachtwoorden in plaintext via chat of e-mail; gebruik geheimenbeheertools voor teams
- Als u wachtwoorden offline opschrijft, zorg dan voor fysieke beveiliging
Wachtwoorden Genereren via Programmeertalen
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);
}