Выбор между Ed25519 и RSA чаще всего встаёт, когда кто-то запускает ssh-keygen и задумывается, какое значение передать в -t. То же сравнение относится и к подписи кода и файлов. Ed25519 даёт 128-битную стойкость при крошечных ключах и быстрых детерминированных подписях; RSA даёт универсальную совместимость ценой гораздо большего размера, а также более медленной и менее надёжной генерации ключей.
Коротко о главном
| Ed25519 | RSA-3072 | |
|---|---|---|
| Стойкость | около 128 бит | около 128 бит (RSA-2048: 112) |
| Закрытый ключ | 32-байтный seed | 3072-битный модуль и значения 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 |
| Имена алгоритмов в SSH | ssh-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.
#!/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"
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 — обычная ротация ключей.
- Сгенерируйте новый ключ командой
ssh-keygen -t ed25519 -a 100(больше раундов KDF для парольной фразы) или на ключе безопасности. - Установите его рядом со старым ключом: допишите его в
authorized_keysна каждом сервере, добавьте в аккаунт на Git-хостинге и в систему управления конфигурацией и убедитесь, что можете войти с помощьюssh -i ~/.ssh/id_ed25519. - Для ключей хостов добавьте
HostKey /etc/ssh/ssh_host_ed25519_keyвsshd_config; клиенты сUpdateHostKeys(в современных версиях OpenSSH этот параметр включён по умолчанию) узнают новый ключ автоматически, а записи вknown_hostsможно обновить до удаления ключа RSA. - Удалите ключ RSA из
authorized_keys, аккаунтов и агентов, когда от него больше ничего не зависит, и проверьте по журналам, остались ли клиенты, которые всё ещё согласовывают RSA. - Если RSA всё же нужно сохранить, убедитесь, что
ssh-rsa(SHA-1) нигде не включён снова: ищите+ssh-rsaвHostKeyAlgorithmsилиPubkeyAcceptedAlgorithms.ssh -Q HostKeyAlgorithmsпоказывает, какие алгоритмы поддерживает клиент,nmap --script ssh2-enum-algos— какие предлагает сервер, а инспектор SSH-ключей показывает тип, размер и отпечаток ключа.
Источники
- RFC 8709, алгоритмы открытых ключей Ed25519 и Ed448 для SSH
- RFC 8332, использование ключей RSA с SHA-256 и SHA-512 в SSH
- RFC 8032, EdDSA
- Примечания к выпуску OpenSSH 8.8 (отключение ssh-rsa)
- Примечания к выпуску OpenSSH 9.5 (Ed25519 по умолчанию)
- NIST SP 800-57, часть 1, редакция 5, таблица 2
- NIST IR 8547, первый публичный проект
- Amazon EC2: создание пары ключей