Рейтинг:1

Безопасно ли использовать RSA для обмена ключами AES?

флаг jp

Мне нужно создать клиент-серверное приложение с использованием Java, и я хочу обеспечить безопасность связи. Я подумал использовать AES для шифрования сообщений, а для обмена ключами я делаю следующие шаги:

  • Клиент генерирует ключи RSA и отправляет открытый ключ на сервер
  • Сервер зашифрует ключ AES с помощью открытого ключа RSA (ключ AES генерируется случайным образом для каждого клиента).
  • Клиент расшифровывает сообщение своим закрытым ключом RSA, после чего все сообщения будут зашифрованы с помощью AES.

Мой вопрос: это хорошая практика?

Swashbuckler avatar
флаг mc
По сути, то, что вы описали, - это упаковка ключей с использованием открытого/закрытого ключа. Это также можно сделать с помощью симметричных ключей. Вместо того, чтобы изобретать свой собственный способ сделать это и, возможно, совершить ошибку, вы должны взять существующую реализацию из хорошей криптобиблиотеки и использовать ее.
Maarten Bodewes avatar
флаг in
Реальный вопрос: как вы собираетесь доверять открытому ключу, который вы получаете? Он может быть создан противником. Обычно именно здесь вступает в игру PKI — довольно часто PKIX с сертификатами X.509, которые используются, например, в ваш браузер для аутентификации TLS (сервер).
Maarten Bodewes avatar
флаг in
В противном случае да, RSA можно использовать для создания ключа, с основным недостатком, заключающимся в том, что генерация пары ключей довольно медленная, поэтому, если вы хотите использовать новую пару ключей для каждого соединения для обеспечения безопасности пересылки, у вас может возникнуть проблема с эффективностью. Вот почему вместо этого обычно используется (EC)DH.
kelalaka avatar
флаг in
Отвечает ли это на ваш вопрос? [Надежно ли прямое шифрование RSA ключей AES?] (https://crypto.stackexchange.com/questions/76855/is-direct-rsa-encryption-of-aes-keys-secure)
Рейтинг:2
флаг kr

Нет, это не очень хорошая практика.

  1. Он склонен к человек посередине атака. Когда сервер получает открытый ключ, он не знает, исходит ли этот ключ от клиента или от «человека посередине». Таким образом, «человек посередине» может перехватывать трафик между клиентом и сервером, для клиента он может имитировать сервер, для сервера может имитировать клиента. Таким образом, вся коммуникация будет 1) известна MitM и 2) данные, отправленные в обоих направлениях, могут быть изменены MitM.
  • --> Этого можно избежать, если вы аутентифицируете клиентов на сервере или аутентифицируете сервер на клиентах с помощью сертификаты открытых ключей.
  1. Он склонен к повторить атаку. Предположим, клиент отправляет команду «перевести 1000 долларов США на счет 123456789». Это может быть законной операцией. Но если злоумышленник перехватит трафик и перешлет его в течение относительно короткого времени (так что сервер все еще использует тот же ключ для шифрования AES для этого клиента), то сервер не сможет отличить, идет ли этот трафик от клиента или от атакующий и выполнит команду.Даже если вы аутентифицируете клиентов на сервере или сервер на клиентах, эта проблема все равно будет сохраняться.
  1. Хорошая вещь: ваш текущий подход относительно хорош. прямая секретность: прошлые сеансы защищены от компрометации клиентских ключей или паролей сеансов в будущем. Но если вы решите проблему 1, упомянутую выше (аутентификация), и начнете использовать один и тот же ключ RSA в нескольких сеансах, вы потеряете секретность пересылки. Если злоумышленник получит закрытый ключ, все прошлые сеансы могут быть расшифрованы. Чтобы предотвратить это, вам потребуются дополнительные меры, например. эфемерный Обмен ключами Диффи-Хеллмана.

  2. Независимо от всех вышеперечисленных проблем, важно правильно использовать RSA, как упоминал @kelalaka. Смотрите подробности здесь и здесь.

Таким образом, может быть гораздо безопаснее использовать реализацию TLS, предоставляемую Java, вместо реализации собственного протокола.

флаг cn
Может быть, вы можете добавить: для TLS 1.3 комитет по стандартизации полностью исключил RSA для согласования ключей. Что показала история с атаками PKCS#1 и Bleichenbacher: RSA может быть просто плохим выбором для обмена ключами, и не стоит заморачиваться, чтобы сделать это правильно, когда все проблемы намного проще исправить, используя другие методы.

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

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