Наткнулся на интересное решение для генерации случайного пароля с помощью JavaScript. Код очень короткий и простой, он мне настолько понравился, что я решил написать про него небольшую статейку. Расписывать тут особо нечего, вся генерация сводится к одной строке:
Math.random().toString(36).slice(-8);
На этом можно закончить, но получилось совсем короткая запись, даже по меркам twitter`a. Поэтому добавлю пояснение и еще один вариант генерации.
Простая генерация пароля с помощью JavaScript
Для начала попробуем разобраться, как работает эта короткая строка. Первая часть кода Math.random() генерирует случайное число от 0(включительно) до 1(не включительно), то есть создается произвольное число с большим количеством знаков после запятой, например: 0.7642436524728753. Далее с помощью метода toString(36), полученное длинное число, переводится в строку. Самое интересное, что при переводе можно указывать основание системы счисления, которая будет использоваться при переводе числа. Таким образом, число превращается в набор символов и чисел, получится что-то подобное: 0.rigjv73pl7. И в конце с помощью метода slice() отрезается нужное количество символов. Если методу передать один отрицательный параметр, то отсчет символов будет с конца.
Когда все стало понятно, также стали очевидны и недостатки кода. Максимальное количество символов, которое может содержать пароль, это 10-11 штук. Также есть очень маленькая, даже практически невозможная, возможность получить ошибку. Ошибка произойдет, когда сгенерируется число 0, без длинного хвоста или когда сгенерируется 0.5 – такой вариант тоже возможен. Но эти недостатки ни сколько не принижают эстетическую красоту кода генерации пароля в одну строку:
var randomstring = Math.random().toString(36).slice(-8);
Можно оформить код в небольшую функцию, которая будет генерировать пароль с заданым количеством символов:
function gen_password(len){ if(len > 10) len = 10; len = len * (-1); return Math.random().toString(36).slice(len); }
Второй вариант генерации пароля в JavaScript
Бывает необходимость генерировать пароли длиннее 10 символов, а также иногда необходимо использовать в пароле не только буквы и цифры, а еще и другие случайные символы. Для таких случаев можно воспользоваться этим способом:
function gen_password(len){ var password = ""; var symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!№;%:?*()_+="; for (var i = 0; i < len; i++){ password += symbols.charAt(Math.floor(Math.random() * symbols.length)); } return password; }
Послесловие
Когда дописал статью, вспомнил, что на блоге уже есть подобная функция, только написана она на php: почитать.
Спасибо за внимание, пишите красивый код!
P.S. Если не получается красивое решение, то пишите красивые костыли…
К сожалению использование Math.random не может считаться безопасным способом создания случайных чисел т. к. его алгоритм предсказуем и уже устарел. Об этом также написано на MDN https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Для генерации пароля рекомендую использовать приптографически стойкие генераторы. Например passfather https://www.npmjs.com/package/passfather