Руководство по безопасности
Почему Math.random небезопасен для паролей
Узнайте, почему Math.random подходит для визуальных эффектов, но не для паролей, кодов сброса, токенов и других конфиденциальных секретов.
Краткое описание
Math.random() — это общая псевдослучайная функция JavaScript. Она полезна для анимаций, случайного поведения интерфейса, примеров, игр и симуляций. Она не предназначена для криптографической безопасности и не должна использоваться для генерации паролей, кодов сброса, секретов API, ключей подписи или токенов восстановления.
Проблема
Генератору паролей требуется непредсказуемость для защиты от атакующего, а не просто значения, которые выглядят разнообразными для пользователя. Math.random() не предоставляет гарантии криптографической безопасности на уровне браузера, и реализации могут различаться в разных движках.
Более безопасный вариант в браузере
Современные браузеры предоставляют crypto.getRandomValues() через Web Crypto API. PwdGen использует этот интерфейс и метод отбраковки, что позволяет избежать смещения при выборе символов. Если этот API недоступен, безопасное поведение — остановить генерацию и объяснить требование совместимости.
Как проверить генератор
Поищите в исходном коде Math.random. Серьезный генератор паролей не должен использовать его для символов пароля. Он может встречаться в документации, объясняющей, почему он небезопасен, но не в пути генерации.
Подробное руководство
Это руководство посвящено тому, почему Math.random непригоден для паролей и секретов. Оно написано для разработчиков, студентов и пользователей инструментов, проверяющих, использует ли генератор безопасную случайность, поэтому практическая цель — не создать драматическое заявление о безопасности. Цель — выбрать привычку работы с паролями, которая выдержит повседневное использование: формы входа, менеджеры паролей, мобильные клавиатуры, восстановление учетной записи, общие устройства и случайные сервисы со странными правилами валидации. Безопасная рекомендация полезна только в том случае, если реальный человек может последовательно ей следовать.
Самый безопасный отправной пункт — случайность плюс уникальность. Случайность означает, что значение выбирается из большого пространства с помощью криптографически подходящего источника случайности, а не придумывается из дня рождения, клички питомца, шаблона клавиатуры или любимой цитаты. Уникальность означает, что один и тот же пароль не используется нигде больше. Пароль, который длинный, но повторно используемый, может быстро стать уязвимым после одной несвязанной утечки, в то время как уникальный случайный пароль ограничивает ущерб только той учетной записью, где он был использован.
Для этой темы практический пресет — crypto.getRandomValues с отбраковкой вместо Math.random. Вы можете применить этот пресет с помощью руководства по Web Crypto API, а затем сохранить итоговое значение в надежном менеджере паролей. PwdGen генерирует значения локально в браузере с помощью Web Crypto; сгенерированный пароль не отправляется на сервер PwdGen. Такая локальная конструкция снижает воздействие на сервер, но не защищает от всех угроз. Вредоносное расширение браузера, скомпрометированное устройство, фишинговая страница или небезопасная обработка буфера обмена все еще могут раскрыть секрет после его генерации.
Наиболее распространенные проблемы, которых следует избегать: предсказуемые псевдослучайные последовательности, смещение по модулю, пользовательские случайные функции и демонстрационный код, скопированный в продакшн. Эти проблемы важны, потому что злоумышленникам редко приходится перебирать все возможные пароли, когда человеческие привычки дают им лазейку. Подбор учетных данных, фишинг, утекшие списки паролей и злоупотребление восстановлением учетной записи часто более реалистичны, чем чистый математический поиск. Вот почему лучший совет сочетает качество пароля с защитой на уровне учетной записи, такой как MFA, ключи доступа, хранение кодов восстановления и регулярная проверка настроек электронной почты или телефона для восстановления.
Используйте этот контрольный список при применении рекомендации:
- Не используйте Math.random для паролей.
- Используйте Web Crypto в браузерах.
- Используйте Node crypto или проверенный пакет в CLI-коде.
- Проверьте на случайный код отката.
Если веб-сайт отклоняет идеальные настройки, не принуждайте пароль к более слабому шаблону вручную. Изменяйте одну переменную за раз. Если символы отклонены, оставьте заглавные, строчные буквы и цифры включенными и увеличьте длину. Если максимальная длина мала, используйте наибольшую принятую длину и убедитесь, что значение уникально. Если пароль нужно читать вслух, печатать или вводить на экране телевизора или маршрутизатора, рассмотрите возможность исключения запутанных символов и увеличьте длину, чтобы компенсировать меньший алфавит.
Наконец, помните о границах советов по паролям. Надежный пароль — это один уровень защиты, а не гарантия. Он не может сделать фишинговую страницу безопасной, исправить вредоносное ПО или компенсировать сервис, который плохо хранит учетные данные. Полезная привычка скучна, но долговечна: сгенерируйте уникальное значение, храните его безопасно, защитите путь восстановления и быстро замените его, если подозреваете раскрытие.
Безопасный следующий шаг
После прочтения этого руководства проведите один небольшой аудит учетной записи вместо того, чтобы пытаться исправить все сразу. Выберите учетную запись, которая причинит наибольшие проблемы в случае взлома, подтвердите, что ее пароль уникален, и проверьте электронную почту для восстановления, телефон для восстановления, метод MFA и хранение резервных кодов. Если какая-либо часть этой цепочки слаба, улучшите ее, прежде чем переходить к учетным записям с более низким риском. Такой порядок делает работу управляемой и защищает учетные записи, которые злоумышленники, скорее всего, используют как трамплин. Что касается того, почему Math.random небезопасен для паролей, лучший результат — это повторяемая привычка: генерировать локально, хранить осторожно и избегать повторного использования.
Часто задаваемые вопросы
Допустим ли Math.random когда-либо?
Да, для визуальных эффектов, симуляций и обычной случайности интерфейса, но не для учетных данных или токенов безопасности.
Что следует использовать вместо него генераторам паролей?
Они должны использовать криптографический источник случайности, такой как crypto.getRandomValues() в браузере.
Использует ли PwdGen Math.random в качестве запасного варианта?
Нет. Если Web Crypto недоступен, PwdGen показывает предупреждение о совместимости и не генерирует пароли с помощью Math.random().