Alat Pembuat & Validator Kata Sandi
Alat profesional untuk membuat dan memvalidasi kata sandi, menghasilkan kata sandi yang kuat dan frasa sandi yang mudah diingat dengan dukungan pembuatan batch, jaminan keunikan, penilaian kekuatan, dan validasi kebijakan. Fitur mencakup sumber acak yang aman secara kriptografi, set karakter yang dapat dikonfigurasi, penyaringan karakter serupa, statistik deduplikasi batch, dan fungsi salin satu klik. Termasuk contoh kode multibahasa, basis pengetahuan kata sandi, praktik terbaik keamanan, dan alat pengujian kebijakan. Semua operasi dilakukan secara lokal di browser Anda, memastikan privasi dan keamanan.
Penguji Kebijakan Kata Sandi
- Panjang
- Huruf Kecil
- Huruf Besar
- Angka
- Simbol
- Berurutan
- Pengulangan
- Daftar Terlarang
Generator Frasa Sandi
Panduan Ringkas Hashing Kata Sandi
- Gunakan Argon2id dengan parameter memori-kerja yang wajar
- Waktu ≥ 2 putaran, memori ≥ 64MB (sesuaikan sesuai lingkungan)
- Simpan salt unik per pengguna; secara opsional gunakan pepper di lapisan aplikasi
- Pilih SHA-256 atau SHA-512 dengan iterasi ≥ 210k (sesuaikan sesuai kebutuhan)
- Gunakan salt unik untuk setiap hash; dukung peningkatan parameter
- Pindah ke parameter biaya lebih tinggi saat pengguna login berikutnya
- Atur biaya antara 10–14, bergantung pada kemampuan server
- Hindari masalah pemotongan; hash seluruh kata sandi
- Terapkan pembatasan tingkat dan pemantauan pada endpoint otentikasi
Evaluator Kekuatan Kata Sandi
Kekuatan diperkirakan dari entropi: entropi = log2(ukuran kumpulan karakter) × panjang. Kumpulan karakter yang lebih besar dan panjang yang lebih baik meningkatkan ketahanan terhadap tebakan.
- Lemah: < 50 bit —— Hanya cocok untuk skenario sekali pakai atau bernilai rendah
- Cukup: 50–80 bit —— Dapat diterima untuk skenario berisiko rendah
- Kuat: 80–110 bit —— Target bawaan yang direkomendasikan
- Sangat Kuat: > 110 bit —— Direkomendasikan untuk akun admin atau akun penting
Catatan: Model serangan di dunia nyata dapat bervariasi; hindari penggunaan kembali kata sandi dan aktifkan autentikasi multifaktor (MFA).
Cara Penggunaan
- Panjang dan set karakter (Huruf Kecil/Besar/Angka/Simbol); aktifkan hindari karakter serupa dan wajib sertakan setiap jenis jika diperlukan
- Untuk kontrol lebih detail: kecualikan karakter tertentu atau grup karakter, atau pilih subset simbol
- Pilih berapa banyak kata sandi yang ingin Anda hasilkan, lalu klik Hasilkan; hasil batch akan diduplikasi secara otomatis dan dapat disalin sekaligus
- Untuk memvalidasi kata sandi yang ada, gunakan Penguji Kebijakan; untuk frasa sandi yang mudah diingat, gunakan Pembuat Frasa Sandi
Fitur
- Sumber acak yang aman secara kriptografi (Web Crypto)
- Set karakter dan grup simbol yang dapat dikonfigurasi
- Penyaringan karakter serupa dan pengecualian khusus
- Pembuatan batch 1-100 kata sandi, selalu unik
- Metrik kekuatan dan entropi
- Penguji Kebijakan dan Pembuat Frasa Sandi
- Contoh kode multibahasa
- Salin satu klik (satu atau semua)
Basis Pengetahuan Kata Sandi
- Entropi ≈ log2(ukuran set karakter) × panjang; panjang biasanya memberikan kontribusi lebih besar
- Target yang disarankan: Akun umum ≥ 80 bit; Akun hak akses tinggi/keuangan ≥ 110 bit
- Set karakter yang lebih besar + panjang lebih lama → ketahanan lebih tinggi terhadap tebakan
- Menambahkan simbol secara acak kurang efektif daripada menambah panjang
- Hindari pola yang dapat diprediksi (misal: selalu 'Huruf kapital di awal + angka di akhir!')
- Prioritaskan panjang yang cukup, lalu tingkatkan keragaman karakter secara moderat
- Urutan keyboard (misal: qwerty), blok berulang, tanggal lahir/tahun mudah menjadi target aturan pemecah kata sandi
- Menggunakan 'kata sandi root + akhiran situs' menciptakan variasi penggunaan ulang, memusatkan risiko dan membuat kata sandi lebih mudah ditebak
- Jangan pernah menggunakan kata sandi yang sama di banyak situs web
- Gunakan pengelola kata sandi; pastikan kata sandi unik per situs; aktifkan MFA untuk akun penting
- Hindari mengirim kata sandi dalam teks biasa melalui saluran publik; gunakan frasa sandi yang 'mudah diucapkan' jika diperlukan
- Segera ganti dan buat kata sandi unik jika terdeteksi kebocoran atau penggunaan ulang
- Kombinasi 4–6 kata acak biasanya kuat dan mudah diingat
- Campurkan pemisah, gunakan huruf awal besar, dan sisipkan angka untuk meningkatkan kekuatan serta keterbacaan
- Jangan langsung menggabungkan frasa umum, lirik lagu, atau kutipan terkenal
Praktik Terbaik Keamanan Kata Sandi
- Gunakan panjang yang cukup: minimal 16 karakter untuk akun umum, 24+ untuk akun krusial
- Untuk kemudahan diingat, prioritaskan frasa sandi; gunakan pengelola sandi untuk menyimpan sandi acak berkekuatan tinggi
- Aktifkan autentikasi multi-faktor (MFA) jika memungkinkan
- Jangan pernah menggunakan kembali sandi di berbagai situs—setiap akun harus memiliki sandi unik
Entropi mengukur ketidakprediktabilitas berdasarkan panjang dan ukuran set karakter—semakin banyak bit entropi, biasanya semakin kuat sandinya.
- Prioritaskan peningkatan panjang untuk mendapatkan peningkatan kekuatan maksimal
- Gunakan beberapa set karakter jika memungkinkan
- Mengecualikan terlalu banyak karakter mengurangi kumpulan karakter dan melemahkan kekuatan
- Lebih baik gunakan persyaratan panjang dan daftar hitam sandi umum yang bocor daripada aturan komposisi yang rumit
- Jangan melakukan rotasi wajib yang sering; ganti sandi hanya saat terdeteksi pelanggaran atau risiko
- Gunakan daftar sandi yang dikompromikan untuk memblokir sandi umum atau yang bocor
- Gunakan 4–6 kata acak yang digabungkan dengan pemisah, contoh: danau-WORTEL-planet_7
- Jangan gunakan kutipan terkenal, lirik lagu, atau frasa umum lainnya; keacakan lebih penting daripada "kelincahan"
- Untuk akun krusial, gunakan pengelola sandi untuk menyimpan sandi acak dengan entropi yang benar-benar tinggi
- "Membutuhkan setiap set yang dipilih" memastikan setidaknya satu karakter dari setiap kategori yang dipilih muncul
- "Hindari karakter serupa" meningkatkan keterbacaan namun sedikit mengurangi ukuran kumpulan karakter
- Simbol dapat dibatasi pada subset yang didukung oleh sistem target
- Jangan pernah menyimpan sandi dalam teks biasa; gunakan hashing kuat (Argon2id/PBKDF2/Bcrypt) dengan salt
- Konfigurasi parameter (memori/waktu/biaya) dengan tepat; pertimbangkan untuk menggunakan pepper jika diperlukan
- Batasi jumlah percobaan login dan pantau kegagalan; terapkan CAPTCHA atau verifikasi perangkat saat terjadi serangan
- Lebih baik gunakan TOTP atau kunci perangkat; hindari SMS jika memungkinkan
- Alur pemulihan yang aman dengan verifikasi multi-faktor atau email dan terapkan periode tunggu
- Berikan kode pemulihan cadangan dan dorong pengguna untuk menyimpannya dengan aman
- Terapkan penundaan progresif atau penguncian dengan skor risiko IP/perangkat
- Terapkan WAF dan pembatasan laju pada API dan formulir login
- Pantau serangan credential stuffing dan dorong pengguna untuk menggunakan sandi unik
- Gunakan pengelola sandi terpercaya untuk penyimpanan dan pengisian otomatis
- Jangan pernah membagikan kata sandi dalam teks biasa melalui obrolan atau email; gunakan alat manajemen rahasia untuk tim
- Jika menuliskan kata sandi secara offline, pastikan keamanan fisiknya
Cara Membuat Kata Sandi melalui Bahasa Pemrograman
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);
}