Password Generator
Buat password acak yang kuat dengan panjang dan kumpulan karakter yang dapat disesuaikan
Apa Itu Password Generator?
Password generator membuat string karakter acak yang digunakan sebagai password untuk akun pengguna, API key, kredensial database, dan rahasia enkripsi. Berbeda dengan password yang dipilih manusia, password yang dibuat menarik dari seluruh ruang kemungkinan kombinasi karakter, sehingga tahan terhadap serangan kamus dan tebakan berbasis pola. Alat ini membuat password acak yang kuat secara online menggunakan generator angka acak kriptografis bawaan browser Anda.
Kekuatan password bergantung pada dua faktor: panjang dan keragaman karakter. Password 20 karakter menggunakan huruf besar, huruf kecil, angka, dan simbol memiliki sekitar 131 bit entropi. Pada level tersebut, serangan brute-force yang menguji satu triliun tebakan per detik membutuhkan waktu lebih lama dari usia alam semesta untuk mencoba setiap kombinasi. Rumusnya sederhana: entropi = panjang x log2(ukuran kumpulan karakter).
Standar seperti NIST SP 800-63B merekomendasikan password minimal 8 karakter tanpa batas atas yang diberlakukan oleh verifier, dan tidak menganjurkan aturan komposisi paksa seperti mensyaratkan tepat satu simbol, melainkan mendukung passphrase yang lebih panjang. Untuk kredensial antar mesin dan akun layanan, 20 karakter acak atau lebih yang diambil dari kumpulan karakter lengkap adalah standar dasar yang diterima di sebagian besar kerangka keamanan dan rezim kepatuhan.
Mengapa Menggunakan Password Generator?
Manusia adalah generator angka acak yang buruk. Kita menggunakan ulang password, memilih kata dari kamus, mengganti huruf dengan pola yang dapat diprediksi (@ untuk a, 3 untuk e), dan cenderung menggunakan string pendek. Password generator menghilangkan bias manusia dari proses tersebut.
Kasus Penggunaan Password Generator
Referensi Entropi Password
Entropi mengukur seberapa tidak dapat diprediksinya sebuah password. Dihitung sebagai log2(ukuran_kumpulan_karakter ^ panjang). Entropi yang lebih tinggi berarti lebih banyak kemungkinan kombinasi yang harus dicari penyerang. NIST dan OWASP merekomendasikan setidaknya 80 bit entropi untuk aplikasi keamanan tinggi.
| Panjang | Kumpulan Karakter | Entropi | Waktu Brute-Force |
|---|---|---|---|
| 8 | lower + digits | ~41 bits | Minutes to hours |
| 12 | lower + upper + digits | ~71 bits | Centuries (offline) |
| 16 | all character sets | ~105 bits | Beyond brute-force |
| 20 | all character sets | ~131 bits | Beyond brute-force |
| 32 | all character sets | ~210 bits | Beyond brute-force |
| 64 | all character sets | ~419 bits | Beyond brute-force |
Waktu pembobolan mengasumsikan 1 triliun tebakan per detik (serangan offline dengan GPU modern). Serangan online dengan pembatasan laju jauh lebih lambat berberapa orde besarnya.
CSPRNG vs Math.random() untuk Pembuatan Password
Sumber keacakan sama pentingnya dengan panjang password. Password yang dibuat dengan generator angka acak yang dapat diprediksi dapat direkonstruksi oleh penyerang yang mengetahui algoritma dan kondisi seed. Alat ini menggunakan crypto.getRandomValues(), yang merupakan cryptographically secure pseudorandom number generator (CSPRNG) bawaan setiap browser modern.
Contoh Kode
Buat password secara terprogram dalam berbagai bahasa. Setiap contoh di bawah ini menggunakan sumber acak yang aman secara kriptografis, bukan Math.random() atau PRNG lemah yang setara.
// Generate a random password in the browser or Node.js 19+
function generatePassword(length = 20) {
const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'
const values = new Uint32Array(length)
crypto.getRandomValues(values)
return Array.from(values, v => charset[v % charset.length]).join('')
}
console.log(generatePassword()) // โ "kR7!mZp$Xw2&nLq9@Yf3"
console.log(generatePassword(32)) // โ "Hd4%tNx!Qw8#mKp2Rv6&Zj0*Ls3Yb7@"import secrets
import string
def generate_password(length: int = 20) -> str:
"""Generate a cryptographically secure random password."""
alphabet = string.ascii_letters + string.digits + string.punctuation
return ''.join(secrets.choice(alphabet) for _ in range(length))
# Single password
print(generate_password()) # โ "kR7!mZp$Xw2&nLq9@Yf3"
# Batch of 5 passwords
for _ in range(5):
print(generate_password(24))
# Ensure at least one char from each category
def generate_strong(length: int = 20) -> str:
required = [
secrets.choice(string.ascii_uppercase),
secrets.choice(string.ascii_lowercase),
secrets.choice(string.digits),
secrets.choice(string.punctuation),
]
remaining = length - len(required)
alphabet = string.ascii_letters + string.digits + string.punctuation
all_chars = required + [secrets.choice(alphabet) for _ in range(remaining)]
secrets.SystemRandom().shuffle(all_chars)
return ''.join(all_chars)# OpenSSL โ generate 32 random bytes, base64-encode openssl rand -base64 32 # โ "x7Kp2mNqR4wZ8vLs1Yb0Hd6tFj3Xc9Ga5eUi+Wo=" # /dev/urandom with tr โ alphanumeric + symbols, 20 chars tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 20; echo # โ "kR7!mZp$Xw2&nLq9@Yf3" # pwgen (install: apt install pwgen / brew install pwgen) pwgen -sy 20 5 # Generates 5 passwords, 20 chars each, with symbols
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
func generatePassword(length int) (string, error) {
charset := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"
result := make([]byte, length)
for i := range result {
idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
if err != nil {
return "", err
}
result[i] = charset[idx.Int64()]
}
return string(result), nil
}
func main() {
pwd, _ := generatePassword(20)
fmt.Println(pwd) // โ "kR7!mZp$Xw2&nLq9@Yf3"
}