JavaScript ile şifre üreteci: ders
Hazır aracı dene: Şifre üreteci →
Şifre üreteci (crypto)
Tarayıcıda çalışır; hiçbir şey sunucuya gitmez.
JavaScript Password Generator nedir?
Şifre üreteci seçtiğin karakter setinden rastgele karakterler alıp yan yana dizer. Asıl soru şudur: rastgelelik nereden gelir? Tarayıcıda iki yol var. Math.random hızlıdır ama şifre için değildir, çünkü sonucu tahmin edilebilir. crypto.getRandomValues ise işletim sisteminin kriptografik kaynağından bayt verir. Şifre için yalnız ikincisi kullanılır. Hepsi sayfanın içinde olur ve hiçbir şey sunucuya gitmez.
JavaScript Password Generator ne için kullanılır?
Bu ders JavaScript’te güvenli rastgele sayı, form ve kopyalama işini bir arada gösterir.
- Yeni hesap için güçlü şifre almak
- Wi-Fi veya API anahtarı için uzun dizi
- Math.random ile crypto farkını öğrenmek
- Clipboard API ile kopyalama düğmesi
JavaScript Password Generator ile ne yapılabilir?
Kullanıcı uzunluğu (örneğin 8–64) ve setleri seçer: küçük harf, büyük harf, rakam, sembol. Kod seçilen setleri tek dizide birleştirir. Sonra her karakter için rastgele indeks alır. Hazır şifre tek düğmeyle kopyalanır. HTTPS’te tarayıcı navigator.clipboard verir, yoksa eski execCommand yolu kalır. Şifre localStorage’a yazılmaz ve hiçbir yere gönderilmez. Bitmiş aracı denemek için /tools/password sayfasına bak.
JavaScript Password Generator öğrenmek zor mu?
Kod kısadır ama bir tuzak var. Rastgele baytı sadece «% uzunluk» ile bölersen bazı karakterler daha sık çıkar. Buna modulo yanlılığı denir. Çözüm rejection sampling’dir: set uzunluğuna tam bölünen en büyük sınırın üstündeki sayıyı atıp yenisini alırsın. Bir de: her seçilen setten en az bir karakter olsun diye sonradan karıştırmak gerekir ve karıştırma da crypto ile olmalıdır.
Avantajları ve sınırları
Avantaj: sunucu yok, iz kalmaz, kod her tarayıcıda çalışır. Sınır: şifreyi saklamak senin işin — bunun için şifre yöneticisi gerekir. Uzunluk, karakter türünden daha çok güç verir.
Temel kavramlar
Bu dört kavramı bilirsen kodun her satırı açık olur.
- crypto.getRandomValues — kriptografik rastgelelik
- Math.random — oyun için, şifre için değil
- Rejection sampling — modulo yanlılığına karşı
- Entropi ≈ uzunluk × log2(set boyutu)
Kısa örnek
Rastgele indeksi yanlılıksız alan fonksiyon ve şifreyi dizen döngü:
1. Yanlılıksız rastgele indeks:
function randomIndex(max) {
const limit = Math.floor(0x100000000 / max) * max;
const buf = new Uint32Array(1);
do { crypto.getRandomValues(buf); } while (buf[0] >= limit);
return buf[0] % max;
}Bu fonksiyon 0 ile max-1 arası rastgele bir indeks döndürür.
limit, 2^32'den küçük ve max'a tam bölünen en büyük sayıdır.
crypto.getRandomValues buf'a kriptografik rastgele sayı yazar.
Sayı limit'e eşit veya büyükse atılır ve yenisi alınır. Böylece hiçbir indeks diğerinden sık çıkmaz.
Sonda % max sayıyı 0…max-1 aralığına sokar.
2. Karakter setleri:
const SETS = {
lower: "abcdefghijklmnopqrstuvwxyz",
upper: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
digits: "0123456789",
symbols: "!@#$%^&*()-_=+[]{};:,.?",
};Bu nesne dört karakter havuzu tutar: küçük harf, büyük harf, rakam, sembol.
Kullanıcı hangi kutuları işaretlerse şifre yalnızca o havuzlardan alınır.
Havuz büyüdükçe her karakterin seçeneği artar ve şifreyi tahmin etmek zorlaşır.
3. Şifreyi dizen döngü:
function makePassword(length, chosen) {
const pool = chosen.map((k) => SETS[k]).join("");
if (!pool) throw new Error("Choose at least one set");
let out = "";
for (let i = 0; i < length; i++) out += pool[randomIndex(pool.length)];
return out;
}chosen, seçilen set adlarıdır, örneğin ["lower", "digits"]. pool bunların karakterlerini tek bir metinde birleştirir.
Hiçbir şey seçilmezse fonksiyon hata verir, boş şifre dönmez.
Döngü length kez çalışır. Her seferinde randomIndex havuzdan bir karakter seçer ve out'un sonuna ekler.
Sonuç: ekranda gösterilen hazır şifre metni, örneğin k7#Qm2…
4. Her setten en az bir karakter ve karıştırma:
function makeStrongPassword(length, chosen) {
const chars = chosen.map((k) => SETS[k][randomIndex(SETS[k].length)]);
const pool = chosen.map((k) => SETS[k]).join("");
while (chars.length < length) chars.push(pool[randomIndex(pool.length)]);
for (let i = chars.length - 1; i > 0; i--) {
const j = randomIndex(i + 1);
[chars[i], chars[j]] = [chars[j], chars[i]];
}
return chars.join("");
}İlk satır her seçilen setten bir zorunlu karakter alır. Rakam seçildiyse şifrede mutlaka rakam olur.
while kalan yerleri ortak havuzdan doldurur.
for döngüsü Fisher–Yates karıştırmasıdır: zorunlu karakterler hep başta kalmasın diye yerleri rastgele değiştirir.
Sonuç: seçilen her türü içeren ama sırası tahmin edilemeyen bir şifre.
Sık sorulan sorular
- Math.random kullanılabilir mi? Şifre için hayır. Sonucu kriptografik değildir ve tahmin edilebilir.
- Şifre sunucuya gider mi? Hayır. Tarayıcıda hesaplanır ve hiçbir yerde saklanmaz.
- Kaç karakter iyi? En az 16. Uzunluk, karakter türünden daha çok yardım eder.
- Hazır araç nerede? nibrascode.com/tools/password sayfasında.