Інструмент генерації та перевірки паролів
Професійний інструмент для генерації та перевірки паролів, який створює надійні паролі та запам'ятовувані фрази-паролі з підтримкою пакетної генерації, гарантією унікальності, оцінкою надійності та перевіркою за політикою. Має криптографічно безпечне джерело випадкових чисел, настроювані набори символів, фільтрування подібних символів, статистику виявлення дублікатів у пакеті та функцію копіювання одним клацанням. Включає багатомовні приклади коду, базу знань про паролі, найкращі практики безпеки та інструменти тестування політики. Усі операції виконуються локально у вашому браузері, що забезпечує конфіденційність та безпеку.
Генератор паролів
-
#
Тестувальник політики паролів
- Довжина
- Рядкові літери
- Великі літери
- Цифри
- Символи
- Послідовність
- Повторення
- Список заборонених
Генератор фраз-паролів
Шпаргалка хешування паролів
- Використовуйте Argon2id з розумними параметрами, що вимагають багато пам'яті
- Час ≥ 2 проходи, пам'ять ≥ 64 МБ (налаштуйте залежно від середовища)
- Зберігайте унікальну сіль для кожного користувача; за бажанням використовуйте пеппер на рівні додатка
- Оберіть SHA-256 або SHA-512 з кількістю ітерацій ≥ 210 тисяч (налаштуйте за потребою)
- Використовуйте унікальну сіль для кожного хешу; забезпечте підтримку оновлення параметрів
- Перенесіть на параметри вищої вартості під час наступного входу користувача
- Встановіть вартість між 10–14, залежно від можливостей сервера
- Уникайте проблем з обрізанням; хешуйте весь пароль
- Реалізуйте обмеження швидкості та моніторинг на кінцевих точках автентифікації
Оцінювач складності пароля
Складність наближено визначається ентропією: ентропія = log2(розмір набору символів) × довжина. Більший набір символів та довша довжина підвищують стійкість до підбору.
- Слабкий: < 50 біт —— Підходить лише для одноразових операцій або ситуацій з низькою цінністю даних
- Задовільний: 50–80 біт —— Прийнятний для сценаріїв з низьким ризиком
- Надійний: 80–110 біт —— Рекомендована ціль за умовчанням
- Відмінний: > 110 біт —— Рекомендований для адміністративних або критичних облікових записів
Примітка: Реальні моделі атак можуть відрізнятися; уникайте використання однакових паролів для декількох облікових записів та вмикайте багатофакторну аутентифікацію (MFA).
Як користуватися
- Виберіть довжину та набір символів (малі/великі літери/цифри/символи); додатково можна ввімкнути опцію "Уникати подібних" та "Вимагати кожного типу"
- Для більш точного контролю: виключіть конкретні символи або групи символів, або виберіть підмножини символів
- Оберіть, скільки паролів потрібно згенерувати, потім натисніть «Згенерувати»; результати пакетної генерації автоматично видаляють дублікати, і їх можна скопіювати одразу всі
- Для перевірки існуючих паролів використовуйте "Тестер політики"; для запам'ятовуваних фраз-паролів — "Генератор фраз-паролів"
Можливості
- Криптографічно безпечне джерело випадкових чисел (Web Crypto)
- Настроювані набори символів та групи символів
- Фільтрування подібних символів та власні виключення
- Пакетна генерація 1-100 унікальних паролів
- Метрики надійності та ентропії
- Тестер політики та генератор фраз-паролів
- Багатомовні приклади коду
- Копіювання одним клацанням (одного або всіх паролів)
База знань про паролі
- Ентропія ≈ log2(розмір набору символів) × довжина; довжина зазвичай має більший вплив
- Рекомендовані цілі: Загальні акаунти ≥ 80 біт; Акаунти з високими правами/фінансові акаунти ≥ 110 біт
- Більший набір символів + довша довжина → вища стійкість до підбору
- Додавання символів без розбору менш ефективне, ніж збільшення довжини
- Уникайте передбачуваних схем (наприклад, завжди "Велика перша літера + остання цифра!")
- Пріоритизуйте достатню довжину, потім помірно збільшуйте різноманітність символів
- Клавіатурні послідовності (наприклад, qwerty), повторювані блоки, дні народження/роки легко виявляються за допомогою правил
- Використання "пароль кореня + суфкс сайту" створює варіанти повторного використання, концентрує ризик та робить паролі легшими для підбору
- Ніколи не використовуйте той самий пароль на кількох веб-сайтах
- Використовуйте менеджер паролів; забезпечте унікальні паролі для кожного сайту; ввімкніть MFA для критичних акаунтів
- Уникайте передачі паролів у відкритому вигляді через загальнодоступні канали; за потреби використовуйте "вимовими" фразами-паролями
- Негайно змініть та зробіть унікальними паролі, якщо виявлено їх витік або повторне використання
- Комбінації з 4–6 випадкових слів зазвичай є надійними та легко запам’ятовуються
- Змішуйте роздільники, використовуйте великі початкові літери та додавайте цифри, щоб підвищити надійність та зручність запам’ятовування
- Уникайте прямого з’єднання загальних фраз, текстів пісень або відомих цитат
Найкращі практики безпеки паролів
- Використовуйте достатню довжину: 16+ символів для звичайних облікових записів, 24+ — для критично важливих
- Для зручності запам’ятовування віддавайте перевагу фразовим паролям; використовуйте менеджер паролів для зберігання випадкових паролів високої надійності
- Якщо можливо, увімкніть багатофакторну автентифікацію (MFA)
- Ніколи не використовуйте однакові паролі на різних сайтах — для кожного облікового запису має бути унікальний пароль
Ентропія вимірює непередбачуваність залежно від довжини та розміру набору символів — чим вище значення ентропії в бітах, тим надійнішим зазвичай є пароль
- Збільшуйте довжину для максимального зростання надійності
- За можливості використовуйте кілька наборів символів
- Виняття забагатьох символів зменшує розмір набору та знижує надійність
- Віддавайте перевагу вимогам до довжини та чорним спискам поширених/викрадених паролів, а не складним правилам формування
- Уникайте частих обов’язкових оновлень; змінюйте пароль лише після виявлення порушення безпеки або ризику
- Використовуйте списки скомпрометованих паролів для блокування поширених або викрадених паролів
- Використовуйте 4–6 випадкових слів, з’єднаних роздільниками, наприклад: озеро-МОРКВА-планета_7
- Уникайте відомих цитат, текстів пісень або інших поширених фраз; важливіше випадковість, ніж «оригінальність»
- Для критично важливих облікових записів використовуйте менеджер паролів для зберігання справді випадкових паролів високої ентропії
- «Вимагати з кожного вибраного набору» гарантує появу щонайменше одного символу з кожної обраної категорії
- «Уникати подібних» покращує зручність запам’ятовування, але трохи зменшує розмір набору символів
- Символи можна обмежити підмножиною, що підтримується цільовою системою
- Ніколи не зберігайте паролі у відкритому вигляді; використовуйте надійне хешування (Argon2id/PBKDF2/Bcrypt) із сіллю
- Налаштуйте параметри (пам’ять/час/вартість) належним чином; за потреби розгляньте використання перцю
- Обмежуйте кількість спроб входу та моніторте помилки; застосовуйте CAPTCHA або перевірку пристрою під час атак
- Віддавайте перевагу TOTP або апаратним ключам; за можливості уникайте SMS
- Забезпечуйте безпечні процеси відновлення за допомогою багатофакторної або поштової перевірки та вимкнення періодів очікування
- Надавайте резервні коди відновлення та заохочуйте користувачів зберігати їх у безпечному місці
- Реалізуйте поступові затримки або блокування за оцінкою ризику IP/пристрою
- Застосовуйте WAF та обмеження частоти для API та форм входу
- Моніторте атаки типу credential stuffing та заохочуйте користувачів використовувати унікальні паролі
- Використовуйте надійний менеджер паролів для зберігання та автозаповнення
- Ніколи не передавайте паролі у відкритому вигляді через чати чи електронну пошту; використовуйте інструменти для керування секретами для команд
- Якщо записуєте паролі офлайн, забезпечте фізичну безпеку
Як генерувати паролі за допомогою мов програмування
function randomPassword(length = 16, sets = {lower:true, upper:true, digits:true, symbols:true}) {
const pools = {
lower: 'abcdefghijklmnopqrstuvwxyz',
upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
digits: '0123456789',
symbols: '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
};
let pool = '';
for (const k of Object.keys(sets)) if (sets[k]) pool += pools[k];
if (!pool) throw new Error('No charset');
// Rejection sampling removes modulo bias
const limit = Math.floor(0x100000000 / pool.length) * pool.length;
const buf = new Uint32Array(1);
let out = '';
for (let i = 0; i < length; i++) {
do { crypto.getRandomValues(buf); } while (buf[0] >= limit);
out += pool[buf[0] % pool.length];
}
return out;
}
import secrets
def random_password(length=16, lower=True, upper=True, digits=True, symbols=True):
pools = {
'lower': 'abcdefghijklmnopqrstuvwxyz',
'upper': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'digits': '0123456789',
'symbols': '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
}
pool = ''.join(v for k, v in pools.items() if locals()[k])
if not pool:
raise ValueError('No charset')
return ''.join(secrets.choice(pool) for _ in range(length))
function random_password($length = 16, $sets = ['lower'=>true,'upper'=>true,'digits'=>true,'symbols'=>true]) {
$pools = [
'lower' => 'abcdefghijklmnopqrstuvwxyz',
'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'digits' => '0123456789',
'symbols' => '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
];
$pool = '';
foreach ($sets as $k => $on) if ($on) $pool .= $pools[$k];
if ($pool === '') throw new Exception('No charset');
$out = '';
for ($i = 0; $i < $length; $i++) {
$out .= $pool[random_int(0, strlen($pool)-1)];
}
return $out;
}
package main
import (
"crypto/rand"
"math/big"
)
func RandomPassword(length int, pool string) (string, error) {
out := make([]byte, length)
for i := 0; i < length; i++ {
nBig, err := rand.Int(rand.Reader, big.NewInt(int64(len(pool))))
if err != nil { return "", err }
out[i] = pool[nBig.Int64()]
}
return string(out), nil
}
import java.security.SecureRandom;
public class Pw {
static final String POOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
static final SecureRandom SR = new SecureRandom();
static String randomPassword(int length) {
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int idx = SR.nextInt(POOL.length());
sb.append(POOL.charAt(idx));
}
return sb.toString();
}
}
using System;
using System.Security.Cryptography;
public static class Pw {
public static string RandomPassword(int length, string pool) {
// GetInt32 draws an unbiased value in [0, pool.Length)
var chars = new char[length];
for (int i = 0; i < length; i++) {
chars[i] = pool[RandomNumberGenerator.GetInt32(pool.Length)];
}
return new string(chars);
}
}
use rand::rngs::OsRng;
use rand::Rng;
fn random_password(length: usize, pool: &str) -> String {
// gen_range is uniform, so there is no modulo bias
let chars: Vec = pool.chars().collect();
(0..length)
.map(|_| chars[OsRng.gen_range(0..chars.len())])
.collect()
}
fn main() {
let pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
let pw = random_password(16, pool);
println!("{}", pw);
}