Логотип ШифрыШифры
ГлавнаяЖурналВойтиРегистрация
ГлавнаяЖурналВойтиРегистрация
Логотип ШифрыШифры2К26Версияъ1
  • WhatsApp
  • Email
  • Telegram
Назад к логу

Как Passkeys окончательно убивают эру паролей

19 декабря 2025 г.•Premium
#безопасность#passkeys#аутентификация

Представьте мир, где вы никогда не забудете пароль, потому что его просто нет. Где фишинг физически невозможен, а взлом аккаунта требует физического доступа к вашему устройству. Это не фантастика – технология уже здесь и называется passkeys.

В 2024-2025 годах Apple, Google и Microsoft синхронизировали усилия и развернули поддержку passkeys на миллиардах устройств. Amazon, PayPal, GitHub, Shopify уже перевели миллионы пользователей на новую систему. Это самая значительная революция в аутентификации за последние 20 лет.

Проблема, которую решают passkeys

Фундаментальные слабости паролей

Пароли были изобретены в 1960-х для мэйнфреймов MIT. Проблема в том, что они основаны на знании (something you know), а знание можно:

  • Угадать (brute force)
  • Украсть (фишинг, кейлоггеры, утечки)
  • Подсмотреть (shoulder surfing)
  • Забыть

Статистика 2024-2025:

  • 81% взломов связаны с украденными/слабыми паролями
  • Средний пользователь использует один и тот же пароль на 13 сайтах
  • Credential stuffing атаки выросли на 145% за год

Почему 2FA тоже не идеален

SMS-коды перехватываются через SIM-swapping. TOTP-коды (Google Authenticator) защищены лучше, но:

  1. Можно украсть seed при настройке
  2. Фишинг всё ещё работает (вы вводите код на поддельном сайте)
  3. Неудобно: нужно доставать телефон, вводить 6 цифр

Как работают passkeys: криптография в деталях

Passkeys основаны на стандарте WebAuthn (Web Authentication) и протоколе FIDO2. Это асимметричная криптография в чистом виде.

Регистрация: создание ключевой пары

Когда вы регистрируетесь на сайте с passkey:

  1. Генерация ключей (локально на устройстве):

    Приватный ключ (ed25519/ES256) → Secure Enclave/TPM
    Публичный ключ → Отправляется серверу
    
  2. Сервер сохраняет:

    • Публичный ключ
    • Credential ID (идентификатор этого passkey)
    • User ID (ваш аккаунт)

Критически важно: Приватный ключ никогда не покидает устройство в классическом FIDO или экосистему провайдера в синхронизированных passkeys (об этом ниже).

Аутентификация: proof of possession

При входе на сайт:

  1. Сервер отправляет challenge:

    {
      "challenge": "случайная_строка_32_байта",
      "rpId": "example.com",
      "allowCredentials": [{"id": "credential_id_base64"}]
    }
    
  2. Устройство запрашивает биометрию/PIN

    • Face ID / Touch ID / Windows Hello
    • После подтверждения приватный ключ доступен для подписи
  3. Криптографическая подпись:

    signature = sign(challenge + rpId + clientData, privateKey)
    
  4. Сервер проверяет:

    verify(signature, challenge + rpId + clientData, publicKey)
    

Если подпись верна – вы аутентифицированы. Никакого секрета не передаётся по сети.

Анатомия passkey

Технически passkey – это:

{
  credentialId: "Base64(random_bytes)",
  publicKey: "-----BEGIN PUBLIC KEY-----...",
  algorithm: "ES256" или "RS256",
  counter: 42, // Защита от replay-атак
  userHandle: "user_id_hash"
}

Почему passkeys убивают фишинг

Проблема фишинга с паролями

Классический фишинг:

  1. Вы получаете письмо: "Ваш аккаунт взломан! Срочно войдите: g00gle.com"
  2. Вы вводите пароль на поддельном сайте
  3. Злоумышленник получает ваш пароль и логинится на реальном сайте

Почему это не работает с passkeys

При создании passkey в его параметрах жёстко прописан Relying Party ID (rpId) – домен сайта:

// Passkey для google.com
rpId: "google.com"

Когда браузер получает запрос на аутентификацию:

  1. Проверяет, что текущий домен == rpId
  2. Если домен другой (g00gle.com) → passkey не активируется
  3. Пользователь физически не может аутентифицироваться на поддельном сайте

Это защита на уровне протокола, а не "осторожности пользователя".

Синхронизация passkeys: удобство vs безопасность

Традиционно FIDO2 предполагал привязку ключа к "железу" (YubiKey). Проблема: потеряли ключ – потеряли доступ ко всем аккаунтам.

Решение: синхронизированные passkeys

Apple (2022):

  • Passkeys хранятся в iCloud Keychain
  • Зашифрованы end-to-end (даже Apple не может расшифровать)
  • Синхронизируются между iPhone, iPad, Mac
  • Восстановление через iCloud recovery

Google (2023):

  • Google Password Manager для Android и Chrome
  • End-to-end шифрование с ключом, производным от Google account
  • Кроссплатформенная синхронизация (Android ↔ Windows через Chrome)

Microsoft (2024):

  • Windows Hello с облачной синхронизацией (preview)
  • Интеграция с Authenticator app

Trade-off безопасности

Что изменилось:

  • FIDO изначально задумывался как "ключ не покидает устройство" (non-exportable)
  • Синхронизированные passkeys стали exportable – они копируются между устройствами через облако
  • Это удобно, но снижает уровень защиты для параноидальных моделей угроз

Атака на синхронизированный passkey требует:

  1. Взломать iCloud/Google account (2FA, пароль)
  2. Получить device secret (физический доступ к любому вашему устройству)
  3. Знать мастер-пароль/PIN устройства

Это на порядки сложнее, чем угадать "Password123", но технически менее безопасно, чем YubiKey.

Для хардкорной защиты: Используйте физические security keys (YubiKey, Titan) без синхронизации. Для всех остальных синхронизированные passkeys – отличный баланс удобства и безопасности.

Практические примеры внедрения

GitHub: case study

GitHub включил passkeys в марте 2023. Результаты через год:

  • 4+ миллиона passkeys создано
  • 0 успешных фишинг-атак на аккаунты с passkey
  • 67% пользователей с passkey никогда не используют пароль
  • Скорость входа: 5 секунд → 1.2 секунды

Shopify: e-commerce

Shopify развернул passkeys для покупателей:

  • Checkout time уменьшился на 40%
  • Cart abandonment снизился на 15% (клиенты не уходили из-за забытого пароля)
  • Поддержка: запросы на восстановление пароля -70%

Реализация на сайте: код

Базовый пример регистрации passkey:

// Регистрация
async function registerPasskey() {
  const options = {
    challenge: Uint8Array.from(randomChallenge, c => c.charCodeAt(0)),
    rp: { name: "My Site", id: "example.com" },
    user: {
      id: Uint8Array.from("user123", c => c.charCodeAt(0)),
      name: "user@example.com",
      displayName: "John Doe"
    },
    pubKeyCredParams: [
      { type: "public-key", alg: -7 },  // ES256
      { type: "public-key", alg: -257 } // RS256
    ],
    authenticatorSelection: {
      authenticatorAttachment: "platform", // Face ID/Touch ID
      userVerification: "required"
    }
  };

  const credential = await navigator.credentials.create({
    publicKey: options
  });

  // Отправляем credential.response на сервер для сохранения
  await fetch('/api/passkeys/register', {
    method: 'POST',
    body: JSON.stringify({
      id: credential.id,
      publicKey: credential.response.getPublicKey(),
      challenge: options.challenge
    })
  });
}

// Аутентификация
async function authenticatePasskey() {
  const options = {
    challenge: Uint8Array.from(serverChallenge, c => c.charCodeAt(0)),
    rpId: "example.com",
    userVerification: "required"
  };

  const assertion = await navigator.credentials.get({
    publicKey: options
  });

  // КРИТИЧНО: Передаём clientDataJSON для проверки origin
  const response = await fetch('/api/passkeys/authenticate', {
    method: 'POST',
    body: JSON.stringify({
      id: assertion.id,
      signature: assertion.response.signature,
      authenticatorData: assertion.response.authenticatorData,
      clientDataJSON: assertion.response.clientDataJSON
    })
  });

  if (response.ok) {
    console.log("Authenticated!");
  }
}

Бэкенд: верификация (Python)

Критический момент безопасности: Сервер обязан проверить поле origin в clientDataJSON. Без этого возможна подмена домена.

import json
import hashlib
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.exceptions import InvalidSignature

def verify_passkey(credential_id, signature, authenticator_data, client_data_json):
    # 0. КРИТИЧНО: Валидация Origin (защита от replay на другом домене)
    client_data = json.loads(client_data_json)
    if client_data['origin'] != "https://example.com":
        raise ValueError("Invalid origin - possible attack!")
    
    if client_data['type'] != "webauthn.get":
        raise ValueError("Invalid ceremony type")
    
    # 1. Получаем публичный ключ из БД
    public_key_pem = db.get_public_key(credential_id)
    public_key = serialization.load_pem_public_key(public_key_pem)
    
    # 2. Формируем данные для верификации
    # authData + hash(clientDataJSON)
    client_data_hash = hashlib.sha256(client_data_json.encode()).digest()
    verification_data = authenticator_data + client_data_hash
    
    # 3. Проверяем подпись
    try:
        public_key.verify(
            signature,
            verification_data,
            ec.ECDSA(hashes.SHA256())
        )
        return True
    except InvalidSignature:
        return False

Почему проверка origin критична: Без неё злоумышленник может:

  1. Получить подпись на своём поддельном сайте evil.com
  2. Отправить эту подпись на ваш сайт example.com
  3. Войти в чужой аккаунт (replay attack)

Миграция пользователей: стратегии

Подход 1: Opt-in (GitHub)

  1. Пользователь входит по паролю
  2. Баннер: "Попробуйте passkeys – вход за 2 секунды!"
  3. Wizard настройки passkey
  4. Пароль остаётся как fallback

Плюсы: Не ломает UX
Минусы: Медленная адаптация

Подход 2: Forced migration (некоторые корпорации)

  1. 30-дневное предупреждение
  2. Обязательная настройка passkey при следующем входе
  3. Пароли отключаются

Плюсы: Быстрая адаптация
Минусы: Недовольство консервативных пользователей

Подход 3: Hybrid (оптимальный)

  1. Новые пользователи → только passkeys
  2. Старые пользователи → passkey как дополнение к паролю
  3. После 6 месяцев → предложение отключить пароль
  4. Критичные операции (смена email) → требуют passkey если он есть

Мобильные платформы: кроссплатформенный опыт

QR-код flow для desktop

Пользователь на Windows/Linux без passkey:

  1. Сайт показывает QR-код
  2. Сканируете телефоном (iOS/Android с passkey)
  3. Подтверждаете Face ID на телефоне
  4. Десктоп получает authenticated session

Под капотом: Bluetooth Low Energy + encrypted channel для передачи assertion.

Пример из реальной жизни

Вы на чужом компьютере. Нужно войти в Gmail:

  1. gmail.com → кнопка "Use passkey"
  2. QR-код
  3. Достаёте iPhone, открываете камеру
  4. Сканируете → "Authenticate with Face ID?"
  5. Смотрите на телефон → вошли на компьютере

Безопасность:

  • Приватный ключ не покинул телефон
  • Чужой компьютер не получил никаких секретов
  • После выхода сессия закрывается

Проблемы и ограничения

1. Vendor lock-in

Проблема: Passkeys в iCloud не работают с Android (и наоборот).

Решение:

  • 1Password, Bitwarden уже добавили поддержку passkeys
  • Экспорт/импорт стандартизируется (FIDO Alliance)

2. Account recovery

Вопрос: Что если потеряны все устройства?

Текущие решения:

  • Backup codes (одноразовые, печатаете на бумаге)
  • Trusted contacts (друг может подтвердить вашу личность)
  • Hardware security keys (YubiKey как backup)

Проблема: Не решена идеально. Если потеряли всё → можете потерять аккаунт.

3. Shared accounts

Проблема: Как дать доступ к корпоративному аккаунту 5 сотрудникам?

Решение: Каждый создаёт свой passkey. Сервер разрешает multiple passkeys для одного аккаунта.

// На сервере
user.passkeys = [
  { id: "alice_passkey", publicKey: "..." },
  { id: "bob_passkey", publicKey: "..." },
  { id: "charlie_passkey", publicKey: "..." }
]

4. Legacy systems

Проблема: Старые сайты/приложения не поддерживают WebAuthn.

Реальность: В 2025 это становится меньше проблемой. Основные frameworks (Django, Rails, Express.js) имеют готовые библиотеки.

Сравнение с альтернативами

Passkeys vs Hardware tokens (YubiKey)

Параметр Synced Passkeys YubiKey Стоимость Бесплатно (встроено) $50-70 Фишинг-стойкость ✅ Да ✅ Да Синхронизация ✅ Да (облако) ❌ Один девайс Потеря устройства ✅ Восстановление через облако ❌ Нужен backup Максимальная безопасность ⚠️ Exportable keys ✅ Non-exportable Удобство ✅ Отлично ⚠️ Нужно носить с собой

Passkeys vs пароли + TOTP

Параметр Passkeys Пароль + TOTP Фишинг-стойкость ✅ 100% ❌ Фишинг TOTP возможен Удобство ✅ 1 клик ⚠️ Пароль + 6 цифр Скорость ~1 сек ~10 сек Утечки ✅ Невозможны ❌ Пароль может утечь

Будущее аутентификации

2025-2027: Прогнозы

  1. Passwordless everywhere

    • 60% top-100 сайтов поддержат passkeys
    • Браузеры начнут предупреждать о сайтах без passkey
  2. Корпоративное внедрение

    • Microsoft/Google Workspace полностью на passkeys
    • VPN/SSH через FIDO2
  3. Госсервисы

    • eID на базе passkeys
    • Налоговые, банковские системы

Квантовая угроза

Текущие алгоритмы (ECDSA) уязвимы к квантовым компьютерам. План:

  1. 2026: Первые post-quantum алгоритмы в WebAuthn (NIST готовит стандарты PQC)
  2. 2028: Миграция passkeys на quantum-resistant криптографию
  3. 2030: ECDSA deprecated

Практические шаги для внедрения

Для пользователей

  1. iPhone: Настройки → Пароли → включите iCloud Keychain
  2. Android: Chrome → Настройки → Менеджер паролей
  3. GitHub, Google, Microsoft: Зайдите в Security settings → Add passkey
  4. Создайте backup: сохраните recovery codes на бумаге

Для разработчиков

  1. Изучите WebAuthn:

    • webauthn.io – интерактивная демонстрация
    • webauthn.guide – подробный гайд
  2. Используйте библиотеки:

    • JavaScript: @simplewebauthn/browser + @simplewebauthn/server
    • Python: webauthn
    • Go: github.com/go-webauthn/webauthn
  3. Тестируйте:

    • Chrome DevTools поддерживает эмуляцию authenticators
    • Virtual YubiKey для CI/CD
  4. Начните с дополнительного фактора:

    • Не удаляйте пароли сразу
    • Passkey как альтернатива TOTP
    • Мониторьте adoption rate

Для продакт-менеджеров

ROI расчёт:

  • Стоимость поддержки паролей: $10-50 на пользователя/год
  • Стоимость внедрения passkeys: $20k-100k (единоразово)
  • Break-even: 500-5000 пользователей

Метрики успеха:

  • % пользователей с passkey
  • Снижение support tickets
  • Скорость аутентификации
  • Уменьшение cart abandonment (e-commerce)

Заключение

Passkeys – это не инкрементальное улучшение, это смена парадигмы. Впервые за 50+ лет мы можем реалистично говорить о мире без паролей.

Что делает passkeys революционными:

  1. Фишинг физически невозможен (привязка к домену через origin)
  2. Утечки бессмысленны (публичный ключ не секретен)
  3. Удобство превосходит пароли (биометрия быстрее ввода)
  4. Доступность (встроено в миллиарды устройств)

Через 5-10 лет мы будем вспоминать пароли так же, как сейчас вспоминаем модемы dial-up – "Помните, как мы набирали 16-символьные комбинации вручную? Как мы вообще с этим жили?"

Технология готова. Инфраструктура развёрнута. Стандарты утверждены. Осталось только начать использовать.

Первый шаг: зайдите прямо сейчас на github.com/settings/security и добавьте passkey. Займёт 30 секунд. После этого вы никогда не захотите возвращаться к паролям.

Будущее без паролей не наступит само – его создают те, кто внедряет новые технологии сегодня. Станьте частью этой революции.

Автор: root@shifry.local