Я часто использую генераторы паролей и мне надоело, что даже если укажешь спецсимволы, то не факт что они будут. Они могут быть, но нет проверки, на их наличие в сгенерированном пароле. Написала свой генератор паролей |
использую также jquery-3.4.1.min.js
html блок
<div> <label> <input type="checkbox" name="numbers" id="numbers" checked="checked"> Цифры </label><br> <label> <input type="checkbox" name="upper" id="upper" checked="checked"> Прописные (заглавные) буквы </label><br> <label> <input type="checkbox" name="lower" id="lower" checked="checked"> Строчные (маленькие) буквы </label><br> <label> <input type="checkbox" name="symbols" id="symbols"> Специальные символы ~!@-#$ </label> <br> <label> Длина пароля (1-100 символов): <input type="number" name="length" id="length" value="6" min="1" max="100"> </label> <br> <div class="mt-4"><button id="generatePassword" class="btn btn-primary">cоздать пароль</button></div> </div> <div><ul id="result" class="d-none"></ul></div> <div id="error" class="text-danger"></div> |
function generatePassword(length,numbers,upper,lower,symbols){ let charset = ""; if(numbers){ charset += "0123456789"; } if(upper){ charset += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; } if(lower){ charset += "abcdefghijklmnopqrstuvwxyz"; } if(symbols){ charset += "~!@-#$"; } if(charset.length > 0){ if(window.crypto && window.crypto.getRandomValues) { return Array(length) .fill(charset) .map(x => x[Math.floor(crypto.getRandomValues(new Uint32Array(1))[0] / (0xffffffff + 1) * (x.length + 1))]) .join(''); } else { res = ''; for (var i = 0, n = charset.length; i < length; ++i) { res += charset.charAt(Math.floor(Math.random() * n)); } return res; } } else{ return false; } } function checkResult(input,length,numbers,upper,lower,symbols){ let charset,find; let result = true; if(length > 3){ if(numbers){ charset = "0123456789"; find = false; for (var i = 0; i < charset.length; i++){ if(input.includes(charset[i])){ find = true; } } result = find; } if(result && upper){ charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; find = false; for (var i = 0; i < charset.length; i++){ if(input.includes(charset[i])){ find = true; } } result = find; } if(result &&lower){ charset = "abcdefghijklmnopqrstuvwxyz"; find = false; for (var i = 0; i < charset.length; i++){ if(input.includes(charset[i])){ find = true; } } result = find; } if(result && symbols){ charset = "~!@-#$"; find = false; for (var i = 0; i < charset.length; i++){ if(input.includes(charset[i])){ find = true; } } result = find; } } return result; } function inArray(needle, haystack) { var length = haystack.length; for(var i = 0; i < length; i++) { if(haystack[i] == needle) return true; } return false; } $(document).ready(function(){ console.log('test'); $('#generatePassword').on('click',function(){ $('#error').html(""); $('#result').html(""); let length,numbers,upper,lower,symbols,result; length = ""; strLength = String($('#length').val()); for (var i = 0; i < strLength.length; i++){ let s = strLength[i]; if(inArray(s,[0,1,2,3,4,5,6,7,8,9])){ length += s; } } length = Number(length); if(length < 1){ length = 1; $('#length').val(1); } if(length > 100){ length = 100; } $('#length').val(length); numbers = $('#numbers').prop('checked'); upper = $('#upper').prop('checked'); lower = $('#lower').prop('checked'); symbols = $('#symbols').prop('checked'); if(!numbers && !upper && !lower && !symbols){ $('#error').html("Укажите хотя бы 1 параметр"); } else{ let check; for (let i = 0; i < 9; i++) { check = false; while(!check){ result = generatePassword(length,numbers,upper,lower,symbols); check = checkResult(result,length,numbers,upper,lower,symbols); } $('#result').append("<li>"+result+"</li>"); } } }); }); |