JavaScript ilə şifrə generatoru: dərs
Hazır aləti sına: Şifrə generatoru →
Şifrə generatoru (crypto)
Brauzerdə işləyir, heç nə serverə getmir.
JavaScript Password Generator nədir?
Şifrə generatoru seçdiyin simvol dəstindən təsadüfi simvollar götürüb ard-arda düzür. Əsas sual budur: təsadüf haradan gəlir? Brauzerdə iki yol var. Math.random sürətlidir, amma şifrə üçün deyil, çünki onun nəticəsi proqnozlaşdırıla bilər. crypto.getRandomValues isə əməliyyat sisteminin kriptoqrafik mənbəyindən baytlar verir. Şifrə üçün yalnız ikincisi işlədilir. Hamısı səhifənin içində olur və heç nə serverə getmir.
JavaScript Password Generator nə üçün istifadə olunur?
Bu dərs JavaScript-də təhlükəsiz təsadüfi ədəd, form və kopyalama işini bir yerdə göstərir.
- Yeni hesab üçün güclü şifrə almaq
- Wi-Fi və ya API açarı üçün uzun sətir
- Math.random ilə crypto fərqini öyrənmək
- Clipboard API ilə kopyalama düyməsi
JavaScript Password Generator ilə nə etmək olar?
İstifadəçi uzunluğu (məsələn 8–64) və dəstləri seçir: kiçik hərf, böyük hərf, rəqəm, simvol. Kod seçilən dəstləri bir sətirdə birləşdirir. Sonra hər simvol üçün təsadüfi indeks götürür. Hazır şifrəni bir düymə ilə kopyalamaq olur. Brauzer HTTPS-də navigator.clipboard verir, yoxdursa köhnə execCommand yolu qalır. Şifrə localStorage-a yazılmır və heç yerə göndərilmir. Bitmiş aləti sınamaq üçün /tools/password səhifəsinə bax.
JavaScript Password Generator öyrənmək çətindirmi?
Kod qısadır, amma bir tələ var. Təsadüfi baytı sadəcə «% uzunluq» ilə bölsən, bəzi simvollar digərlərindən tez-tez çıxır. Buna modulo meyli deyilir. Həll rejection sampling-dir: dəstin uzunluğuna tam bölünən ən böyük həddən yuxarı gələn ədədi atıb yenisini götürürsən. Bir də: hər seçilmiş dəstdən ən azı bir simvol olsun deyə sonradan qarışdırmaq lazımdır, qarışdırma da crypto ilə olmalıdır.
Üstünlükləri və məhdudiyyətləri
Üstünlük: server yoxdur, iz qalmır, kod hər brauzerdə işləyir. Məhdudiyyət: şifrəni saxlamaq sənin işindir — bunun üçün şifrə meneceri lazımdır. Uzunluq simvol növündən daha çox güc verir.
Əsas anlayışlar
Bu dörd anlayışı bilsən, kodun hər sətri aydın olur.
- crypto.getRandomValues — kriptoqrafik təsadüf
- Math.random — oyun üçün, şifrə üçün deyil
- Rejection sampling — modulo meylinə qarşı
- Entropiya ≈ uzunluq × log2(dəst ölçüsü)
Qısa nümunə
Təsadüfi indeksi meylsiz götürən funksiya və şifrə yığan dövr:
1. Meylsiz təsadüfi 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 funksiya 0 ilə max-1 arası təsadüfi indeks verir.
limit — 2^32-dən kiçik, max-a tam bölünən ən böyük ədəddir.
crypto.getRandomValues buf-a kriptoqrafik təsadüfi ədəd yazır.
Ədəd limit-dən böyükdürsə atılır və yenisi götürülür. Belə olanda heç bir indeks digərindən tez-tez çıxmır.
Sonda % max ədədi 0…max-1 aralığına salır.
2. Simvol dəstləri:
const SETS = {
lower: "abcdefghijklmnopqrstuvwxyz",
upper: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
digits: "0123456789",
symbols: "!@#$%^&*()-_=+[]{};:,.?",
};Bu obyekt dörd simvol hovuzu saxlayır: kiçik hərf, böyük hərf, rəqəm, simvol.
İstifadəçi checkbox ilə hansını seçirsə, şifrə yalnız o hovuzlardan götürülür.
Hovuz böyüdükcə hər simvolun ehtimalı çoxalır və şifrəni tapmaq çətinləşir.
3. Şifrəni yığan dövr:
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çilmiş dəstlərin adlarıdır, məsələn ["lower", "digits"]. pool onların simvollarını bir sətirdə birləşdirir.
Heç nə seçilməyibsə funksiya xəta verir və boş şifrə çıxmır.
Dövr length dəfə işləyir. Hər dəfə randomIndex hovuzdan bir simvol seçir və out-un sonuna əlavə edir.
Nəticə: ekranda göstərilən hazır şifrə sətri, məsələn k7#Qm2…
4. Hər dəstdən ən az bir simvol və qarışdı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("");
}Birinci sətir hər seçilmiş dəstdən bir məcburi simvol götürür. Belə ki rəqəm seçilibsə, şifrədə mütləq rəqəm olur.
while qalan yerləri ümumi hovuzdan doldurur.
for dövrü Fisher–Yates qarışdırmasıdır: məcburi simvollar həmişə əvvəldə qalmasın deyə yerləri təsadüfi dəyişir.
Nəticə: hər seçilmiş növü olan, lakin sırası təxmin edilməyən şifrə.
Tez-tez verilən suallar
- Math.random ilə olmaz? Şifrə üçün olmaz. Onun nəticəsi kriptoqrafik deyil və proqnozlaşdırıla bilər.
- Şifrə serverə gedir? Xeyr. Hamısı brauzerdə hesablanır və heç yerdə saxlanmır.
- Neçə simvol yaxşıdır? Ən azı 16. Uzunluq simvol növündən daha çox kömək edir.
- Hazır alət haradadır? nibrascode.com/tools/password səhifəsində.