Цели защиты канала связи может быть две: обеспечение целостности и конфиденциальности.
Конфиденциальность обеспечивается с помощью симметричного шифрования (например, AES256). Даётся она практически бесплатно за счёт аппаратной реализации AES, при этом трафик растёт незначительно, криптостойкость высокая, технология обкатанная. Симметричное шифрование сводит проблему защиты канала связи к проблеме обеспечения секретности ключа, которая, к сожалению, в мире IoT не решаема. Если секретный ключ один на все устройства, то велик шанс его утечки. Даже лицензионное соглашение и NDA не спасут.
Поэтому необходим обмен сессионными ключами и электронная подпись для защиты от MITM.
Если необходима только целостность сообщений, то единственным решением без раскрытия секретного ключа на конечном устройстве будет использование ЭП.
И тут весь букет проблем IoT расцветает пышным цветом: мало памяти, слабые мощности, низкая скорость каналов связи, необходимость быстрого холодного старта (в случае одностороннего канала связи) и обязательная совместимость со старыми протоколами. Всё это очень плохо совмещается с электронной подписью и асимметричной криптографией в целом.
Чтобы обойти эти ограничения, изобретают новые варианты криптоалгоритмов:
- Патентованный Algebraic Eraser, который на днях раскритиковали и который значительно экономит клиентские ресурсы;
- ISO/IEC 9796-2:2002, который используется в банковских чипах EMV. Главная его особенность - размер подписи ~22 байта (правда подпись неотчуждаема от сообщения);
- TESLA Broadcast Authentication Protocol, который использует перевернутые цепочки хэшей для подписи (интересная идея!);
- и другие...
Базовый синтаксис для командной строки выглядит так:
Сгенерировать приватный ключ
openssl ecparam -out private.pem -name prime256v1 -genkey
Сгенерировать публичный ключ
openssl ec -in private.pem -pubout -out public.pem
Подписать
openssl dgst -ecdsa-with-SHA1 -sign private.pem test.txt > signature.bin
Проверить подпись
openssl dgst -ecdsa-with-SHA1 -verify public.pem -signature signature.bin test.txt
Замерить скорость:
openssl speed ecdsap256
Размер подписи зависит напрямую от выбранной кривой (посмотреть все доступные кривые можно командой openssl ecparam -list_curves) и уменьшить его нельзя (можно сэкономить 1-2 байта на кодировке, потеряв совместимость).
Если у вас большое количество коротких команд размером несколько байт - то электронная подпись увеличит ваш трафик в 10 раз :(. При этом нужно иметь ввиду, что слишком короткая кривая может привести к раскрытию приватного ключа, если у злоумышленника есть возможность обзора/генерации большого количества подписанных пакетов.
- Эллиптическая кривая secp109 (109 бит) была взломана в 2002 (10 000 PC, 549 дней);
- Кривая 112бит была взломана в 2009 (3.5 месяца на кластере из 200 PS3);
- Чтобы взломать 131 бит необходимо 4 * 10^5 ядролет для AMD Phenom 9500 (с возможным сокращением времени на 25% для некоторых кривых);
- Эллиптическая кривая secp160k1 считается достаточной по стойкости до 2020 года;
- Кривая secp256k1 (openssl обзывает её prime256k1) является стандартом де-факто в мире ECDSA (биткоин активно ее использует);
- Кривая secp384 рекомендована NSA для защиты до уровня "сов.секретно".
Если размер подписи является определяющим параметром - то криптопротоколы типа TESLA, использующие хэш в качестве подписи, являются привлекательным решением, так как хэш может быть обрезан до любой необходимой вам длины (потеряв при этом, естественно, в стойкости). RSA/ECDSA подпись, к сожалению, обрезана/архивирована быть не может.
Ещё одна проблема ECDSA (да и многих других алгоритмов ЭП в т.ч. ГОСТ 34.10-2012) - наличие правильного генератора случайных чисел (PRNG, ГСЧ), который в IoT взять проблематично. В ECDSA генератор случайных чисел используются не только при генерации ключевой пары, но и при каждой подписи. Причём известно, как минимум, уже две атаки, которые серьезно подорвали доверие к ECDSA (хотя косяк то был на стороне программистов): взлом PS3, кража биткоинов с Android кошельков. Существует модификация ECDSA (RFC6979), которая обходится без случайных чисел при подписи сообщений, но она в настоящий момент не распространена.
Большой вопрос касательно электронной подписи - это устойчивость к квантовому криптоанализу. Это, к счастью, неактуально ещё сегодня, но может быть актуальным (а может и не быть) через лет эдак 50, но про это в следующий раз.
Комментариев нет:
Отправить комментарий