Цифровая подпись против HMAC с ключом через DH
Я пишу приложение, которое интенсивно использует криптологию. Как и большинство сетевых приложений, моя разделяет данные на различные типы сообщений (мгновенные сообщения, файловый блок, видеокадр и т. Д.), И каждое из них должно быть проверено на подлинность как на предмет защиты от подделки, так и на правильное происхождение. Пока что я могу использовать ECDH для согласования общего секрета, который я уже использую для AES. Конечно, тот же секрет может быть использован позже.
У меня такой вопрос: есть ли в этом случае какое-либо дополнительное преимущество использования ECDSA для подписи каждого сообщения вместо простого использования общего секрета, установленного ECDH с HMAC?
Ниже, когда я говорю "М", я имею в виду либо зашифрованное сообщение, либо открытый текст; это не должно иметь значения. Пожалуйста, исправьте все ошибки ниже.
Я понимаю, что в ECDSA (или DSA) обычно хэширует сообщение (M
) с алгоритмом безопасного хеширования (в настоящее время я использую один из SHA-2), чтобы сделать H(M)
, а затем шифрует H(M)
используя закрытый ключ подписавшего. Это производит R
а также S
целые числа (подпись). Затем M, R и S отправляются получателю, который уже владеет открытым ключом отправителя. H'(M)
рассчитывается, и подпись проверяется с помощью R
а также S
, BouncyCastle обеспечивает ECDSASigner
который реализует это.
В HMAC требуется общий секрет, который у меня есть. Затем:HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
(Спасибо за исправление, Paŭlo Ebermann. Подробности смотрите в его ответе.)
Итак, учитывая, что DH/ECDH безопасно согласовывают общий секрет, есть ли причина, по которой я не должен использовать HMAC?
Связанный: почему NSA определяет стандартный алгоритм для DSA, а не MAC? Только потому, что это может быть SHA-2 + AES?
Скорость здесь важна, потому что я хочу, чтобы этот протокол, который я создаю, теперь поддерживал не только текстовые сообщения, но и большие файлы и видеокадры в ближайшем будущем. Поэтому я предпочитаю использовать HMAC, но хочу убедиться, что смогу достичь поставленных целей.
Спасибо за вашу помощь!
1 ответ
Один из недостатков DSA заключается в том, что для подписи вам нужны довольно хорошие случайные байты. Это даже тот случай, когда с помощью неверного случайного источника ваш личный ключ может быть восстановлен по подписи. Для MAC вы должны подписать много сообщений, поэтому вам нужно много случайных чисел. Если у вас нет аппаратного обеспечения для их производства, у вас закончится энтропия.
HMAC не нуждается ни в каких случайных числах (это является детерминированным).
Кроме того, я думаю, что HMAC будет более эффективным, чем использование DSA, но вы можете (и должны) это измерить.
О "правильных ошибках": Ваше описание HMAC не совсем верно - "расшифровки" нет. Это больше похоже на это:
У вас есть сообщение M
хеш-функция H
и общий секрет K
, Добавьте две публичные функции f1
а также f2
(это простое заполнение XOR+). затем
HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
с ||
быть простой конкатенацией. Отправитель и получатель выполняют одинаковые вычисления, отправитель отправляет свой с сообщением, а затем получатель сравнивает свой результат с отправленным. (Удостоверьтесь, что вы проводите сравнение таким образом, чтобы не допустить временных атак, т.е. сравнивайте все, даже если вы уже обнаружили, что оно не соответствует.)
Точное определение HMAC содержится в RFC 2104, который также содержит некоторые поясняющие цифры.
По этому вопросу:
Связанный: почему NSA определяет стандартный алгоритм для DSA, а не MAC?
Я не совсем уверен, но вот одна идея:
Список ссылок там упоминает " Режим счетчика Галуа" для TLS (RFC 5288) и SSH (RFC 5647), и это, как говорят, защищает как конфиденциальность, так и целостность в одном. Таким образом, отдельный MAC больше не нужен. (Я впервые это читаю, поэтому не могу судить об этом прямо сейчас.)