Рейтинг:0

Подвержены ли подписи RSA-SHA256 атакам с расширением длины?

флаг mq

Мне нужно подписать сообщение с помощью закрытого ключа и проверить сообщение с помощью открытого ключа, убедившись, что сообщение не было подделано.

Я знаю, что сам SHA-256 подвержен атакам с расширением длины.

Я также знаю, что такие вещи, как HMAC, были специально разработаны для обхода таких атак.

Но что, если я подпишу сообщение с помощью RSA и SHA-256? Безопасны ли они?

Нужно ли подписывать RSA/SHA3 для защиты? Или, может быть, урезанные версии SHA2 (а именно SHA-384 и SHA-512/256), которые якобы нет восприимчивы к атакам с расширением длины?

Будет ли HMAC лучшим подходом к этой проблеме?

Я рассматриваю возможность использования RSA, вероятно, самого известного среди асимметричных криптографов. Не стесняйтесь указывать мне на что-то другое, если есть вариант получше. Мне нужно что-то с поддержкой OpenSSL и криптомодуля Node.js (который, насколько мне известно, тоже основан на OpenSSL).

PS. Я немного новичок в криптосообществе, поэтому надеюсь, что мои слова имеют смысл.

-- дополнение--

Вот мое беспокойство по поводу RSA-SHA256.

Допустим, сообщение $ млн $ и его хэш $SHA256(М)$.

Злоумышленник может использовать их для вычисления $М||Х$ и $SHA256(М||Х)$, даже не зная закрытого ключа.В этом случае получатель $М||Х$ и его подпись $SHA256(М||Х)$ должен полагать, что сообщение является действительным, потому что сообщение и его подпись совпадают.

По крайней мере, так происходит, если RSA_sign просто использует необработанный хэш. Если RSA передает хэш с помощью техники, подобной HMAC, или любого другого алгоритма, который предотвращает подделку подписи злоумышленником, я думаю, мы в безопасности.

kelalaka avatar
флаг in
Возможный обман: [Как хешированное значение может быть таким же по длине атаки расширения?] (https://crypto.stackexchange.com/q/87696/18298)
AleksanderCH avatar
флаг nl
Отвечает ли это на ваш вопрос? [Нужен ли HMAC для MAC на основе SHA-3?] (https://crypto.stackexchange.com/questions/17735/is-hmac-needed-for-a-sha-3-based-mac)
vdavid avatar
флаг mq
@AleksanderCH спасибо за ссылку. Это частично отвечает на вопрос. Это показывает, что MAC на основе SHA3 будет безопасным без HMAC, что было одним из моих предположений. Но он не говорит, безопасна ли подпись/проверка RSA-SHA256, что является моим главным вопросом.
kelalaka avatar
флаг in
Отвечает ли это на ваш вопрос? [Как хешированное значение может быть одинаковым по длине атаки расширения?] (https://crypto.stackexchange.com/questions/87696/how-can-hashed-value-be-same-in-length-extension-attack)
vdavid avatar
флаг mq
@kelalaka это интересное чтение о том, как работают атаки с расширением длины, но это не говорит о том, восприимчив ли к ним RSA-SHA256.
Рейтинг:5
флаг my

Но что, если я подпишу сообщение с помощью RSA и SHA-256? Безопасны ли они?

Атаки с увеличением длины не вызывают беспокойства.

Вот что позволяет вам сделать атака с расширением длины: если вам дан хэш $\text{SHA256}(М)$, но вы не знаете исходное сообщение $ млн $ (но вы знаете его длину), то вы можете вычислить значение хеша $\text{SHA256}(М || Х)$ (куда $||$ является конкатенацией битовых строк, и для некоторых значений строки $Х$); значение этого хэша будет отличаться от исходного хэша.

Итак, почему это не проблема:

  • Когда у вас есть подпись известного сообщения $ млн $, ты явно знаешь $ млн $; вы можете (если хотите) вычислить $\text{SHA256}(М || Х)$ для любой строки $Х$ ты хочешь; вам не нужна "атака удлинения длины"

  • RSA подписывает значение $\text{SHA256}(М)$; Значение $\text{SHA256}(М || Х)$ будет другим, и поэтому, если вы замените $ млн $ с $ М || X$, подпись не проверит

vdavid avatar
флаг mq
Меня беспокоит то, что злоумышленник знает `M` и `SHA256(M)`, поэтому он может вычислить `M||X` и `SHA256(M||X)` (даже не зная закрытого ключа). В этом случае получатель `M||X` и его подпись `SHA256(M||X)` не будут знать, что сообщение было подделано, потому что измененное сообщение и его подпись совпадут. Что ж, по крайней мере, это произойдет, если RSA_sign просто использует необработанный хэш.Если RSA передает хэш через HMAC-подобную технику, я думаю, мы в безопасности.
poncho avatar
флаг my
@vdavid: «так что он может вычислить `M||X` и `SHA256(M||X)` (даже не зная закрытого ключа)». - чем это отличается от (скажем) SHA3? С SHA3, если он знает $M$ и выбирает $X$, он может вычислить `SHA3(M||X)`. Если вы думаете, что `SHA256(M||X)` будет тем же значением, что и `SHA256(M)`, то нет, это не так.
fgrieu avatar
флаг ng
@vdavid: Ваш _"получатель `M||X` и его подпись `SHA256(M||X)` ¦"_ ошибочен. `SHA256(M||X)` не является подписью `M||X`. Это промежуточный шаг в вычислении подписи `M||X`, как функции `SHA256(M||X)`, закрытого ключа, необязательной случайности. Среди трех входов этой функции только закрытый ключ является секретным. Таким образом, это не проблема, что `SHA256(M||X)` легко вычислить; это функциональное требование.
vdavid avatar
флаг mq
@poncho SHA3 теоретически лучше, потому что, в отличие от SHA-256, я думаю, что мы *не можем* использовать `M` и `SHA3(M)` для подделки `SHA3(M||X)`
vdavid avatar
флаг mq
@fgrieu Хорошо, если хэш является промежуточным шагом, я думаю, подпись нельзя подделать
fgrieu avatar
флаг ng
@vdavid: вы правы в том, что SHA3, в отличие от SHA-256, не имеет свойства расширения длины. Однако вы не правы в том, что это мешает. Это предотвращает вычисление `SHA3(M||X)` из `SHA3(M)` _если_ никто не знает полностью `M` (в случае SHA-256 нужно дополнительно ограничиться некоторым `X` с точным правильное начало, в зависимости от длины `M`). Зная «M» и «X», можно вычислить «SHA3(M||X)» для любых «M» и «X». Примечание: правильно будет принять ответ пончо, нажав на галочку.
vdavid avatar
флаг mq
@fgrieu Ты прав. И поскольку `M` в моем случае не секрет, я считаю, что это свойство не дает SHA3 значительного преимущества перед SHA-256 (по крайней мере, не с точки зрения расширения длины).
kelalaka avatar
флаг in
На самом деле это должно быть $\text{SHA256}(M || padding_1|| X)$, поскольку исходный хеш имеет дополнение, и во время расширения SHA-256 вычисляет другое дополнение.
poncho avatar
флаг my
@kelalaka: на самом деле, я включил $padding_1$ в $X$ — вот почему я сказал, что это для «некоторых X» — я не думал, что детали атаки с расширением длины действительно важны — он не пытается выполнить атаку, вместо этого он спрашивает о последствиях.
kelalaka avatar
флаг in
$M$ - это сообщение, которое бесплатно для всех, чтобы проверить подпись с его помощью, имхо, эта деталь все же важна.
vdavid avatar
флаг mq
@kelalaka Я бы сказал, что заполнение имеет значение, если неправильное заполнение делает RSA уязвимым для подделки действительной подписи для поддельного сообщения. Это что-то, о чем я должен беспокоиться?
poncho avatar
флаг my
@vdavid: *padding* используется в двух разных смыслах; один из них - это дополнение, выполненное как часть вычисления SHA256 (это деталь, о которой вам не нужно беспокоиться, если только вы не реализуете SHA256). Другой - заполнение, выполняемое после хэша и непосредственно перед необработанным вычислением RSA - это важно (ошибка может позволить кому-то сгенерировать подделки), однако это не имеет ничего общего с атаками с расширением длины.
vdavid avatar
флаг mq
@poncho, какие другие подделки могут произойти, если я использую неправильную прокладку? Есть ли рекомендуемая прокладка? Мне еще предстоит выбрать один из PKCS (или любой другой, который будет лучше для RSA).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.