Password Generator
Генеруйте надійні випадкові паролі з налаштованою довжиною та наборами символів
Що таке Password Generator?
Генератор паролів створює випадкові рядки символів, які використовуються як паролі для облікових записів, API-ключів, облікових даних баз даних та секретів шифрування. На відміну від паролів, обраних людиною, згенеровані паролі охоплюють увесь простір можливих комбінацій символів, що робить їх стійкими до словникових атак та вгадування за шаблонами. Цей інструмент генерує надійні випадкові паролі онлайн за допомогою вбудованого в браузер криптографічного генератора випадкових чисел.
Надійність пароля залежить від двох чинників: довжини та різноманітності символів. Пароль із 20 символів, що містить великі та малі літери, цифри й спецсимволи, має приблизно 131 біт ентропії. На такому рівні атака грубою силою, що перевіряє трильйон спроб на секунду, потребувала б більше часу, ніж вік Всесвіту, щоб перебрати всі комбінації. Математика проста: ентропія = довжина × log2(розмір набору символів).
Такі стандарти, як NIST SP 800-63B, рекомендують паролі довжиною щонайменше 8 символів без верхнього обмеження з боку верифікатора та не заохочують примусових правил складання, як-от вимога рівно одного спецсимволу, надаючи перевагу довшим парольним фразам. Для облікових даних між машинами та сервісними обліковими записами 20 або більше випадкових символів із повного набору є загальноприйнятим базовим рівнем у більшості систем безпеки та режимів відповідності.
Навіщо використовувати генератор паролів?
Люди — ненадійні генератори випадкових чисел. Ми повторно використовуємо паролі, обираємо слова зі словника, замінюємо літери передбачуваними шаблонами (@ замість a, 3 замість e) і схиляємося до коротких рядків. Генератор паролів усуває людську упередженість із цього процесу.
Сценарії використання Password Generator
Довідкова таблиця ентропії паролів
Ентропія вимірює непередбачуваність пароля. Вона обчислюється як log2(charset_size ^ length). Вища ентропія означає більше можливих комбінацій, які зловмисникові доведеться перебирати. 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 проти 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"
}