SSH Ключи объяснены Ed25519 против ECDSA против RSA (остановите нажатие Enter)

Обновлено

Вы ввели ssh-keygen, нажали Enter четыре раза и получили RSA. Вот почему Ed25519 — правильный выбор, что ECDSA делает неправильно, и единственные сценарии, где действительно требуется RSA.

SSH Ключи объяснены: Ed25519 против ECDSA против RSA (остановитесь на нажатии Enter) 1
Реклама · УДАЛИТЬ?

Каждый разработчик делал это. Вы вводите ssh-keygen, появляется волшебник, который спрашивает о типе ключа, длине в битах, фразе-пароле, пути вывода — и вы просто нажимаете Enter, пока не появится случайный рисунок. Поздравляем, у вас теперь есть ключ RSA-2048 и вы не знаете, почему это число.

Краткий ответ: используйте Ed25519. Запустите ssh-keygen -t ed25519 -C "you@example.com" и прекратите читать ответы на StackOverflow из 2012 года. Остальная часть этой статьи объясняет, почему — и охватывает случаи, когда действительно требуется RSA.

Три алгоритма

RSA

RSA (Rivest–Shamir–Adleman, 1977) был стандартным алгоритмом для публичных ключей в интернете на протяжении десятилетий. Его безопасность основана на сложности разложения больших целых чисел, что означает, что вам нужны большие ключи, чтобы оставаться в безопасности — как минимум 2048 бит, лучше 4096. Публичный ключ RSA размером 4096 бит составляет примерно 800 байт. Каждое соединение включает арифметические операции с этими большими числами, что медленнее, чем современные альтернативы.

Единственное реальное обоснование для RSA — совместимость. Старые SSH-серверы, устаревшее оборудование, проприетарные сетевые устройства из начала 2010-х — все они поддерживают RSA. Если вы подключаетесь к системе, которая была настроена во время администрации Обамы и не менялась с тех пор, RSA может быть единственным вариантом.

ECDSA

ECDSA (Elliptic Curve Digital Signature Algorithm) появился как более быстрый и компактный аналог RSA. Ключ ECDSA размером 256 бит обеспечивает примерно такое же безопасность, как ключ RSA размером 3072 бита. Лучшая математика, меньший ключ, быстрые операции — звучит как победа.

Проблема заключается в том, какие кривые использует OpenSSH по умолчанию: кривые NIST (P-256, P-384, P-521). Эти кривые вызывают серьёзные опасения. Вовлечение NIST в стандартизацию эллиптических кривых исторически подозрительно — агентство помогло стандартизировать Dual_EC_DRBG, генератор случайных чисел, под влиянием НАСА, позже обнаруженный с задержкой. ECDSA сама по себе не сломана, но кривые NIST имеют неясные критерии проектирования. Никто не может доказать, что они не были выбраны с целью предоставить какому-то лицу асимметричное преимущество. Большинство разработчиков не являются целями НАСА, но нет смысла принимать «скорее всего безопасно», когда существует доказательно лучший вариант.

Ed25519

Ed25519 (EdDSA на кривой Curve25519) — это тот, который вы должны использовать. Он был разработан Дэниелом Дж. Бернштейном с полностью публичными критериями проектирования — параметры кривой получены из «ничего не в моих рукавах» чисел, а не из процесса, который не подлежит прозрачности.

Практические цифры: публичный ключ Ed25519 составляет 68 байт. Подписание и проверка происходят быстрее, чем у RSA и ECDSA. Алгоритм устойчив к атакам на время — не содержит ветвей, зависящих от секрета, и не использует переменных по времени операций. Поддержка появилась в OpenSSH 6.5 в 2014 году. GitHub, GitLab и Bitbucket поддерживают его уже много лет. Нет недостатков по сравнению с ECDSA и все преимущества по сравнению с RSA.

Сравнение бок о бок

СвойствоRSA (4096-бит)ECDSA (P-256)Ed25519
Размер публичного ключа~800 байт~200 байт68 байт
Эквивалентная безопасность~140 бит~128 бит~128 бит
Скорость подписиМедленноБыстроОчень быстро
Устойчив к атакам на времяНетНетДа (по дизайну)
Опасения по поводу кривыхНиктоКривые NIST (спорные)Нет (Curve25519)
Поддержка в OpenSSH сВсегда5.7 (2011)6.5 (2014)
GitHub / GitLab / BitbucketДаДаДа

Как генерировать каждый тип

Рекомендуемый выбор — используйте этот:

ssh-keygen -t ed25519 -C "you@example.com"

Старая система требует RSA? Используйте минимум 4096 бит:

ssh-keygen -t rsa -b 4096 -C "you@example.com"

ECDSA, если у вас есть конкретная причина избегать Ed25519 (вы, вероятно, не имеете):

ssh-keygen -t ecdsa -b 521 -C "you@example.com"

Если вы хотите интерфейс вместо запоминания флагов, используйте Генератор SSH-ключей на IO Tools позволяет выбрать алгоритм, длину в битах и опции пароля без обращения к терминалу.

Когда действительно требуется RSA

Существуют законные случаи, когда Ed25519 не является возможным:

  • SSH-серверы до 2014 года — любые системы, работающие с OpenSSH старше 6.5, не принимают Ed25519. Редко, но реально: встроенные системы, сетевые устройства, старые серверы RHEL 6, которые никогда не обновлялись.
  • Среды FIPS-140-2 — федеральные и некоторые регулируемые корпоративные среды требуют алгоритмов, прошедших FIPS-проверку. Ed25519 не одобрен FIPS. Используйте RSA-3072+ или ECDSA с P-384 в таких средах.
  • Организационная политика SSH CA — некоторые компании используют собственные сертификатные агентства с жесткими требованиями к типу ключа. Проверьте перед генерацией ключа, который будет отклонён при регистрации.

Помимо этих трёх случаев, аргумент в пользу RSA — это инерция, а не достоинство.

Пропущенный пароль

Когда ssh-keygen спрашивает о пароле, и вы нажимаете Enter, чтобы пропустить это, ваш приватный ключ остаётся на диске в чистом виде. Если кто-то получит ваш ноутбук, он получит доступ ко всему, что может получить этот ключ — каждому серверу, каждому Git-хосту, каждой производственной среде. Добавьте пароль. Используйте ssh-agent таким образом, вы будете вводить его только один раз в сессии:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

На macOS, добавьте --apple-use-keychain к ssh-add таким образом, пароль сохраняется после перезагрузки. На Linux, большинство десктопных сред запускают ssh-agent автоматически — проверьте с помощью echo $SSH_AUTH_SOCK.

Вы нажали Enter четыре раза, не прочитав. Просьба о пароле — это то, что стоит вернуться.

Хотите убрать рекламу? Откажитесь от рекламы сегодня

Установите наши расширения

Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска

в Расширение Chrome в Расширение края в Расширение Firefox в Расширение Opera

Табло результатов прибыло!

Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!

Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?

новости с техническими моментами

Примите участие

Помогите нам продолжать предоставлять ценные бесплатные инструменты

Купи мне кофе
Реклама · УДАЛИТЬ?