Password Generator
Генерируйте надёжные случайные пароли с настраиваемой длиной и наборами символов
Что такое генератор паролей?
Генератор паролей создаёт случайные строки символов, используемые в качестве паролей для учётных записей пользователей, API-ключей, учётных данных баз данных и секретов шифрования. В отличие от паролей, придуманных человеком, сгенерированные пароли охватывают всё пространство возможных комбинаций символов, что делает их устойчивыми к атакам по словарю и угадыванию по шаблонам. Этот инструмент генерирует надёжные случайные пароли онлайн, используя встроенный криптографический генератор случайных чисел вашего браузера.
Надёжность пароля зависит от двух факторов: длины и разнообразия символов. Пароль из 20 символов, включающий заглавные и строчные буквы, цифры и спецсимволы, имеет около 131 бита энтропии. На таком уровне атаке перебором, проверяющей один триллион вариантов в секунду, потребовалось бы больше времени, чем возраст Вселенной, чтобы перебрать все комбинации. Формула проста: энтропия = длина × log2(размер алфавита).
Стандарты вроде NIST SP 800-63B рекомендуют пароли длиной не менее 8 символов без верхнего предела, задаваемого верификатором, и не поощряют принудительные правила состава — например, требование ровно одного спецсимвола — отдавая предпочтение более длинным парольным фразам. Для межмашинных учётных данных и сервисных аккаунтов 20 и более случайных символов из полного набора является принятым базовым требованием в большинстве систем безопасности и нормативных режимов.
Зачем использовать генератор паролей?
Люди плохо справляются с генерацией случайных чисел. Мы повторно используем пароли, выбираем словарные слова, заменяем буквы предсказуемыми шаблонами (@ вместо a, 3 вместо e) и по умолчанию создаём короткие строки. Генератор паролей исключает человеческую предвзятость из этого процесса.
Сценарии использования генератора паролей
Справочник по энтропии паролей
Энтропия измеряет непредсказуемость пароля и вычисляется как log2(размер_алфавита ^ длина). Чем выше энтропия, тем больше возможных комбинаций придётся перебрать злоумышленнику. NIST и OWASP рекомендуют не менее 80 бит энтропии для приложений с высоким уровнем безопасности.
| Длина | Набор символов | Энтропия | Время перебора |
|---|---|---|---|
| 8 | lower + digits | ~41 bits | Minutes to hours |
| 12 | lower + upper + digits | ~71 bits | Centuries (offline) |
| 16 | all character sets | ~105 bits | Beyond brute-force |
| 20 | all character sets | ~131 bits | Beyond brute-force |
| 32 | all character sets | ~210 bits | Beyond brute-force |
| 64 | all character sets | ~419 bits | Beyond brute-force |
Время взлома рассчитано из расчёта 1 триллиона попыток в секунду (офлайн-атака на современных GPU). Онлайн-атаки с ограничением частоты запросов на несколько порядков медленнее.
CSPRNG vs Math.random() для генерации паролей
Источник случайности имеет не меньшее значение, чем длина пароля. Пароль, сгенерированный предсказуемым генератором случайных чисел, может быть восстановлен злоумышленником, знающим алгоритм и начальное состояние. Этот инструмент использует crypto.getRandomValues() — криптографически стойкий генератор псевдослучайных чисел (CSPRNG), встроенный в каждый современный браузер.
Примеры кода
Генерируйте пароли программно на различных языках. Каждый приведённый пример использует криптографически стойкий источник случайности, а не Math.random() или аналогичные слабые PRNG.
// Generate a random password in the browser or Node.js 19+
function generatePassword(length = 20) {
const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'
const values = new Uint32Array(length)
crypto.getRandomValues(values)
return Array.from(values, v => charset[v % charset.length]).join('')
}
console.log(generatePassword()) // → "kR7!mZp$Xw2&nLq9@Yf3"
console.log(generatePassword(32)) // → "Hd4%tNx!Qw8#mKp2Rv6&Zj0*Ls3Yb7@"import secrets
import string
def generate_password(length: int = 20) -> str:
"""Generate a cryptographically secure random password."""
alphabet = string.ascii_letters + string.digits + string.punctuation
return ''.join(secrets.choice(alphabet) for _ in range(length))
# Single password
print(generate_password()) # → "kR7!mZp$Xw2&nLq9@Yf3"
# Batch of 5 passwords
for _ in range(5):
print(generate_password(24))
# Ensure at least one char from each category
def generate_strong(length: int = 20) -> str:
required = [
secrets.choice(string.ascii_uppercase),
secrets.choice(string.ascii_lowercase),
secrets.choice(string.digits),
secrets.choice(string.punctuation),
]
remaining = length - len(required)
alphabet = string.ascii_letters + string.digits + string.punctuation
all_chars = required + [secrets.choice(alphabet) for _ in range(remaining)]
secrets.SystemRandom().shuffle(all_chars)
return ''.join(all_chars)# OpenSSL — generate 32 random bytes, base64-encode openssl rand -base64 32 # → "x7Kp2mNqR4wZ8vLs1Yb0Hd6tFj3Xc9Ga5eUi+Wo=" # /dev/urandom with tr — alphanumeric + symbols, 20 chars tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 20; echo # → "kR7!mZp$Xw2&nLq9@Yf3" # pwgen (install: apt install pwgen / brew install pwgen) pwgen -sy 20 5 # Generates 5 passwords, 20 chars each, with symbols
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
func generatePassword(length int) (string, error) {
charset := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"
result := make([]byte, length)
for i := range result {
idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
if err != nil {
return "", err
}
result[i] = charset[idx.Int64()]
}
return string(result), nil
}
func main() {
pwd, _ := generatePassword(20)
fmt.Println(pwd) // → "kR7!mZp$Xw2&nLq9@Yf3"
}