Вопрос или проблема
У меня есть UDP-клиентское приложение, которое работает долго: в идеале, оно постоянно передает данные на сервер. Я использую Безопасность транспортного слоя для дата그램 (DTLS), чтобы защитить UDP-связь.
- Как часто DTLS обновляет сессионные ключи, установленные во время рукопожатия, которые используются для защиты связи на уровне записи?
- Требуется ли повторное рукопожатие для обновления ключей? Можно ли сделать это другим способом?
В DTLS и даже в TLS нет понятия “обновление ключа”, которое было бы независимым от рукопожатия. Если вам по какой-то причине нужно обновить ваши ключи, вы делаете это, требуя нового рукопожатия. Как клиент, так и сервер могут инициировать новое рукопожатие в любое время (клиент делает это, отправляя ClientHello
, в то время как сервер отправляет HelloRequest
).
В TLS (и DTLS) существует два типа ключей:
- основной секрет устанавливается с помощью асимметричного шифрования (RSA, Диффи-Хеллмана) в рамках “полного рукопожатия”.
- Фактические ключи шифрования и MAC генерируются из основного секрета и “случайных значений”, отправленных клиентом и сервером. Когда клиент и сервер выполняют “сокращенное рукопожатие”, ранее共享енный “основной секрет” повторно используется, но генерируются новые ключи шифрования/MAC.
В TLS или DTLS нет никаких внутренних причин, которые обязывают выполнять новое рукопожатие, за исключением возможного исчерпания различных номеров последовательности; но так как это число – 64-битный счетчик, его исчерпание на практике не происходит (с очень большой натяжкой). Любое конкретное приложение может захотеть сделать “обновление” в любое время и может сделать это, инициировав новое рукопожатие (сокращенное или полное: сокращенное рукопожатие происходит только если и клиент, и сервер согласны на это).
Следует отметить, что рациональных причин для “обновления” ключей очень немного. Люди, которые делают обновление, на самом деле делают это лишь ради формального соответствия нормативным требованиям, основание которых утеряно в тумане времени (обычно это остатки процедур, которые были необходимы для безопасности с криптосистемами до изобретения компьютера). Непризнанный миф, работающий в таких случаях, заключается в предположении, что ключи как-то ухудшаются при использовании, как подшипники для колеса, и должны заменяться регулярно. Этот миф является мифом, но довольно крепким, который до сих пор поддерживает многие стандарты и документы по “лучшей практике”.
(Единственной разумной причиной, которую я видел для “обновления”, на самом деле не касалось обновления; это был сервер TLS, использованный в контексте, где клиент также имеет сертификат, чей закрытый ключ находился на смарт-карте. Сервер регулярно инициировал новое полное рукопожатие, чтобы убедиться, что смарт-карта все еще здесь.)
Ответ или решение
Сессии DTLS и сроки жизни ключей шифрования являются важными аспектами безопасности в приложениях, использующих защищённые протоколы. Рассмотрим два основных вопроса, касающихся обновления сессионных ключей в DTLS.
-
Как часто DTLS обновляет сессионные ключи, установленные во время рукопожатия?
В DTLS, как и в TLS, нет предопределённой частоты обновления сессионных ключей после их первоначального установления. Сессионные ключи, используемые для шифрования данных, генерируются на основе Master Secret, который создаётся при выполнении "полного рукопожатия". После этого, если необходимо обновить ключи, например, из соображений безопасности, необходимо провести новое рукопожатие, чтобы установить новый Master Secret и, соответственно, новые ключи шифрования и MAC.
-
Требуется ли новое рукопожатие для обновления ключей? Можно ли сделать это другим методом?
Да, для обновления ключей действительно необходимо провести новое рукопожатие. В DTLS и TLS эта процедура связана с тем, что обновление ключей требует синхронизации между клиентом и сервером. Как клиент, так и сервер могут инициировать новое рукопожатие в любое время: клиент отправляет сообщение
ClientHello
, тогда как сервер может отправитьHelloRequest
для запроса нового рукопожатия.
Кроме того, в DTLS существуют два типа ключей:
- Master Secret, который устанавливается с помощью асимметричной криптографии (таких как RSA или Диффи-Хеллмана) во время полного рукопожатия.
- Ключи шифрования и MAC, которые производятся на основе Master Secret и "рандомных значений", отправляемых клиентом и сервером.
Важно отметить, что хотя система не требует регулярного обновления ключей, существует ряд случаев, когда приложения могут захотеть это сделать. Однако у большинства таких практик нет объективных причин, кроме выполнения требований нормативных документов, которые часто имеют устаревшую основу и были созданы в эпоху до широкого распространения компьютерной криптографии. Ключи не деградируют с течением времени, как механические элементы, и не требуют регулярной замены.
Тем не менее, в некоторых специфических сценариях, например, когда приватный ключ клиента размещён на смарт-карте, сервер может инициировать полное рукопожатие для контроля наличия смарт-карты.
В конечном счёте, необходимость в частом обновлении ключей должна быть обоснована конкретными потребностями приложения и его безопасностью, а не следованием устаревшим практикам.