Облегченный протокол обмена ключами шифрования - PullRequest
3 голосов
/ 09 марта 2011

У меня есть встроенная система отправки данных в службу JSON REST через HTTP.В настоящее время я использую HMAC-SHA1 для аутентификации, так же, как это делает Amazon AWS .

Сейчас я изучаю варианты шифрования данных при передаче.HTTPS Кажется, что это логичный выбор, поскольку серверная часть не требует особых изменений.Однако мой микроконтроллер имеет относительно небольшую флэш-память (256 КБ) и ОЗУ (96 КБ), и единственными клиентами HTTPS, которые я могу найти, являются коммерческие продукты.Микроконтроллер упрощает шифрование благодаря встроенным «таблицам поиска шифрования AES», но я предполагаю, что мне нужен безопасный способ обмена ключами.

Я изучил SSL, и он выглядит довольно сложным.Какие-нибудь другие более легкие варианты?

Ответы [ 2 ]

5 голосов
/ 09 марта 2011

Большая часть сложности SSL обусловлена ​​высокой модульностью.Клиент может поддерживать несколько «наборов шифров», и сервер выбирает один.Данные могут быть сжаты.Клиент может аутентифицировать себя, представив свой собственный сертификат и используя соответствующий закрытый ключ.Открытый ключ сервера отправляется в виде сертификата X.509, а проверка сертификата X.509 является сложной.

Вы можете существенно упростить SSL путем жесткого кодирования вариантов на стороне клиента.Например, вы решаете, что будете поддерживать только один набор шифров, например, TLS_RSA_WITH_AES_128_CBC_SHA256.Без сжатия.Вы можете жестко закодировать в клиенте открытый ключ сервера и просто проигнорировать сертификат, который отправляет сервер.Если возможно, используйте TLS 1.2 , что требует использования одной хэш-функции (SHA-256) вместо двух (MD5 и SHA-1) для предыдущих версий протокола (TLS - стандартное имя для SSL; TLS 1.0 - это SSL 3.1).

Я (профессионально) реализовал клиент TLS, который поддерживает как AES, так и 3DES, и выполняет элементарную проверку X.509 (только подписи RSA).Полный код умещается в 21 Кбайт ПЗУ (для процессора ARM, код C скомпилирован с помощью инструкций большого пальца) и требует только 19 Кбайт ОЗУ, из которых 16 Кбайт предназначены для входного буфера (максимальный размер для входной записи вSSL, при условии отсутствия сжатия, составляет около 16 Кбайт).Таким образом, SSL может быть достаточно маленьким для микроконтроллера.

Как только вы упростили SSL посредством априорного выбора параметров, выбранных клиентом, вы получите протокол, который примерно такой же легкий, как и он.можно получить: оставшаяся сложность является внутренней.Если вы попытаетесь получить что-то более простое, то в итоге вы получите что-то более слабое.

Что касается существующих реализаций, по крайней мере PolarSSL предназначен для встроенных устройств и доступен по лицензии с открытым исходным кодом (GPLv2).Я не знаю, как маленький он может сжаться.Существует также CyaSSL , который также можно получить в соответствии с условиями GPLv2 и заявляет, что его можно скомпилировать в код размером 30 Кбайт (с минимальными параметрами).

0 голосов
/ 09 марта 2011

SSL использует Диффи-Хеллмана (DH) для обмена ключами.Я думаю, что вы можете относительно легко реализовать это (DH) в своем коде.Единственный вопрос, о котором вам нужно подумать, заключается в том, что DH сам по себе не противостоит атаке «человек посередине» (MITM).Есть несколько вариантов решения этой проблемы.В статье Википедии упоминается о них, так что у вас есть с чего начать.

...