Перейти к содержимому
ecdsa.com

Ed25519 или RSA: какой тип SSH-ключа сгенерировать

Для новых SSH-ключей ответ уже много лет один — Ed25519. Оставшиеся причины генерировать RSA связаны с пробелами в совместимости, и такие случаи встречаются всё реже.
Что сравниваетсяEd25519RSA

Выбор между Ed25519 и RSA чаще всего встаёт, когда кто-то запускает ssh-keygen и задумывается, какое значение передать в -t. То же сравнение относится и к подписи кода и файлов. Ed25519 даёт 128-битную стойкость при крошечных ключах и быстрых детерминированных подписях; RSA даёт универсальную совместимость ценой гораздо большего размера, а также более медленной и менее надёжной генерации ключей.

Коротко о главном

Ed25519RSA-3072
Стойкостьоколо 128 битоколо 128 бит (RSA-2048: 112)
Закрытый ключ32-байтный seed3072-битный модуль и значения CRT
Открытый ключ (raw)32 байта384-байтный модуль и экспонента
Строка .pub в OpenSSH (замер)86 байт558 байт
Подпись64 байта384 байта
Файл SSHSIG с одной подписью (замер)294 байта1 211 байт
Генерация ключамикросекундыв среднем около 100 мс, с большим разбросом
Подписей / проверок в секунду, OpenSSL 3.6.5около 60 000 / 25 000около 1 000 / 54 000
Имена алгоритмов в SSHssh-ed25519, sk-ssh-ed25519@openssh.comтип ключа ssh-rsa; подписи rsa-sha2-256, rsa-sha2-512
Поддержка в OpenSSHс версии 6.5 (2014); по умолчанию с 9.5 (2023)всегда
Детерминированные подписиДаДа для PKCS #1 v1.5, рандомизированные для PSS
NIST IR 8547 (проект)запрещён после 2035 годаRSA-2048 устаревает после 2030 года; любой RSA запрещён после 2035 года

Замеры сделаны с OpenSSH 10.3p1 и OpenSSL 3.6.5 на одном ядре Apple M4 Max.

Размеры и скорость

При одном и том же уровне стойкости 128 бит открытый ключ Ed25519 занимает 32 байта, а модуль RSA-3072 — 384. В SSH эта разница видна в authorized_keys, known_hosts, сертификатах и в каждом рукопожатии: строка открытого ключа Ed25519 занимает 86 байт против 558 у RSA-3072, а файл отсоединённой подписи SSH — 294 байта против 1 211.

Скорость несимметрична. RSA проверяет подписи быстрее, чем Ed25519 (здесь около 54 000 против 25 000 операций в секунду), но подписывает примерно в 60 раз медленнее, а при генерации ключа приходится искать два больших простых числа: на этой машине на один ключ RSA-3072 уходило в среднем около 100 мс, а на маломощных устройствах это может занять гораздо больше времени. Для SSH-серверов, которые подписывают рукопожатие при каждом соединении, ключи хоста Ed25519 меньше нагружают процессор; для пользователей обе схемы работают мгновенно.

Размеры в таблице получены скриптом ниже; ему нужен только OpenSSH.

Сравнение SSH-ключей и подписей Ed25519 и RSA-3072
#!/bin/sh
dir=$(mktemp -d)
cd "$dir" || exit 1
ssh-keygen -q -t ed25519 -N "" -C demo -f id_ed25519
ssh-keygen -q -t rsa -b 3072 -N "" -C demo -f id_rsa
for k in id_ed25519 id_rsa; do
  echo "$k.pub: $(wc -c < $k.pub | tr -d ' ') bytes"
  printf 'hello\n' > "msg-$k"
  ssh-keygen -q -Y sign -f "$k" -n file "msg-$k"
  echo "signature file: $(wc -c < "msg-$k.sig" | tr -d ' ') bytes"
done
cd / && rm -rf "$dir"
Результат с OpenSSH 10.3p1
id_ed25519.pub: 86 bytes
signature file: 294 bytes
id_rsa.pub: 558 bytes
signature file: 1211 bytes

Надёжность и сценарии отказа

У Ed25519 мало настроек: одна кривая, одна хеш-функция, детерминированные nonce, одна кодировка подписи. Не нужно выбирать схему дополнения, и нет слабого набора параметров, который можно выбрать по ошибке.

История RSA — это череда ошибок в параметрах и дополнении. Исходный алгоритм подписи ssh-rsa в SSH хеширует с помощью SHA-1, для которого уже найдены практические коллизии с выбранным префиксом; в OpenSSH 8.8 (сентябрь 2021 года) этот алгоритм отключён по умолчанию, и теперь для ключей RSA используются алгоритмы rsa-sha2-256 или rsa-sha2-512 (RFC 8332) — с любыми современными клиентом и сервером это происходит автоматически. Короткие ключи — ещё одна ловушка: NIST не допускает 1024-битный RSA для подписей с 2013 года, а 2048 бит по шкале NIST соответствуют уровню стойкости 112 бит, который проект NIST IR 8547 предлагает объявить устаревшим после 2030 года. Слабые генераторы ключей выдавали общие или структурированные простые числа (уязвимость ROCA и ключи, которые раскладываются на множители методом batch GCD); у seed Ed25519 такого класса сбоев нет, пока исправно работает генератор случайных чисел.

Совместимость

Ed25519 работает с OpenSSH 6.5 и новее, PuTTY, встроенным в Windows OpenSSH, GitHub, GitLab, Bitbucket, большинством облачных консолей, инстансами EC2 с Linux и подписью коммитов SSH-ключами в Git. Заметные пробелы: инстансы Amazon EC2 с Windows, пары ключей для которых должны быть RSA, потому что этим ключом расшифровывается исходный пароль учётной записи Administrator; некоторые сетевые устройства и встроенные реализации SSH; очень старое корпоративное ПО. Ключам ed25519-sk на основе FIDO нужен аутентификатор с поддержкой EdDSA; ecdsa-sk — аппаратный вариант с более широкой поддержкой.

RSA работает везде, где есть SSH, и это его единственное реальное преимущество. С TLS-сертификатами картина обратная: публично доверенные центры сертификации выпускают сертификаты RSA и ECDSA, но не Ed25519, поэтому это сравнение касается SSH и подписей, а не HTTPS.

Что когда выбирать

  • Личные SSH-ключи и ключи развёртывания в CI: Ed25519, защищённый парольной фразой или хранящийся на ключе безопасности (ssh-keygen -t ed25519-sk).
  • Ключи хостов SSH: предлагайте Ed25519 первым; ключ хоста RSA (только с rsa-sha2-*) оставляйте, пока подключаются старые клиенты, и запланируйте его удаление.
  • Подпись коммитов и файлов SSH-ключами: Ed25519; подписи впятеро меньше, а проверяются той же командой.
  • Инстансы EC2 с Windows, устаревшие устройства, системы, которые нельзя обновить: RSA-3072 или RSA-4096.
  • Аппаратные токены в режиме PIV: то, что токен поддерживает, а это часто RSA или ECDSA P-256, а не Ed25519.
  • Долгосрочное планирование: ни один из вариантов не устоит перед квантовым компьютером; OpenSSH уже защищает сеансовые ключи гибридным постквантовым обменом ключами, а в OpenSSH 10.4 появился экспериментальный составной тип ключа для подписей — ML-DSA-44 вместе с Ed25519.

Заметки о миграции

Замена ключей RSA на Ed25519 — обычная ротация ключей.

  1. Сгенерируйте новый ключ командой ssh-keygen -t ed25519 -a 100 (больше раундов KDF для парольной фразы) или на ключе безопасности.
  2. Установите его рядом со старым ключом: допишите его в authorized_keys на каждом сервере, добавьте в аккаунт на Git-хостинге и в систему управления конфигурацией и убедитесь, что можете войти с помощью ssh -i ~/.ssh/id_ed25519.
  3. Для ключей хостов добавьте HostKey /etc/ssh/ssh_host_ed25519_key в sshd_config; клиенты с UpdateHostKeys (в современных версиях OpenSSH этот параметр включён по умолчанию) узнают новый ключ автоматически, а записи в known_hosts можно обновить до удаления ключа RSA.
  4. Удалите ключ RSA из authorized_keys, аккаунтов и агентов, когда от него больше ничего не зависит, и проверьте по журналам, остались ли клиенты, которые всё ещё согласовывают RSA.
  5. Если RSA всё же нужно сохранить, убедитесь, что ssh-rsa (SHA-1) нигде не включён снова: ищите +ssh-rsa в HostKeyAlgorithms или PubkeyAcceptedAlgorithms. ssh -Q HostKeyAlgorithms показывает, какие алгоритмы поддерживает клиент, nmap --script ssh2-enum-algos — какие предлагает сервер, а инспектор SSH-ключей показывает тип, размер и отпечаток ключа.

Источники

Все сравнения