Около 15 лет в IT-системах, связанных с безопасной передачей данных по недоверенным каналам, начали широко использоваться, помимо классических криптографических алгоритмов RSA и DH, сопоставимые с ними по функционалу, но более быстрые и, предположительно, не менее надёжные криптографические алгоритмы семейства EC или ECC – “elliptic curve” или “elliptic curve cryptography” – “на базе эллиптических кривых”.
Вопросы по функциональности этих алгоритмов и реальной стойкости мы рассмотрим отдельно, пока же сосредоточимся на вопросе “Наши системы поддерживают EC-криптографию; как же выбрать нужные настройки?”.
Список поддерживаемых EC
В случае *nix-систем, для распространённой библиотеки OpenSSL команда для вывода ASN1-имён всех поддерживаемых ECC-кривых будет такой:
openssl ecparam -list_curves
Хотелось бы сразу заметить, что при выполнении команды надо учитывать, что это вывод именно для “системной” библиотеки OpenSSL; в случае, например, использования web-сервера nginx, который собирается с конкретной версией данной библиотеки, список ECC, поддерживаемых именно данным ПО, может отличаться – впрочем, это нетрудно побороть, пересобрав тот же nginx с нужной версией библиотеки.
Для Windows-систем ситуация проще – начиная с NT 6.0 (Vista / 2008) поддерживаются кривые с ASN1-именами Nist256
, Nist384
и Nist521
, а начиная с NT 6.4 (который CloudOS, который NT 10, и в общем-то Windows 10 / Windows Server 2016 в более привычной номенклатуре), можно запросить вывод списка поддерживаемых ECC вот такой вот командой:
certutil -DisplayEccCurve
Фактически поддерживаемые системой ECC-кривые будут задаваться в реестре, список этот будет применяться глобально (на всю систему) и только после перезагрузки (см. статью про SSL/TLS в Windows Server, в которой всё это расписано более подробно).
Как же выбрать подходящий вариант?
Выбираем безопасные ECC
Вообще, сама безопасность криптографических операций с эллиптическими кривыми – что для обмена ключевой информацией (ECDHE), что для подписи (ECDSA) – тема достаточно обширная; но будем всё ж исходить из того, что вы уже решили их использовать и просто выбираете “какие именно”.
Хорошим ресурсом для получения информации будет, например, safecurves.cr.yp.to – там проводится анализ большинства популярных эллиптических кривых по двум классам проблем – ECDLP (т.е. фундаментальным проблемам, связанным с самим алгоритмом) и проблемам реализации данных ECC-алгоритмов. Картинка с результатами на данный момент выглядит примерно так:
(кликните для увеличения до 1093 px на 707 px)Ruslan V. Karmanovrk@atraining.ruУчебный центр Advanced Traininginfo@atraining.ruhttps://www.atraining.ru/
Достаточно интересным выглядит то, что используемые в Windows уже десяток лет Nist256
и Nist384
не проходят ряд тестов и считаются небезопасными. При том, что популярные ресурсы – например, cipherli.st – предлагают Nist384
как лучший вариант, чем “простой Nist256
“.
Поэтому остановимся на простом варианте – список поддерживаемых вашим сервером ECC-кривых должен содержать:
Curve25519
– как безопасную и быструю;Nist P-521
– как входящую в комплект NIST’овских “стандартных” и не имеющую известных на данный момент проблем с безопасностью;- Ну и после уже дополнительные и экзотичные варианты по вкусу – только избегая предположительно проблемных типа
brainpoolP384t1
;
Для Windows настройки ECC приведены в уже упоминавшейся выше статье про SSL/TLS в Windows Server; для приводимого в пример nginx это будет выглядеть простой командой:
ssl_ecdh_curve X25519:secp521r1;
Для другого ПО – действуйте по аналогии.
В общем всё. Удачного применения!