Как работает совершенная прямая секретность (PFS)

Я в классе infosec, и я наткнулся на эту концепцию в Интернете, и это заинтриговало меня. Я также рассмотрел несколько веб-сайтов и википедию, которые объясняют концепцию, а также несколько сообщений о stackoverflow, но я все еще запутался. Из того, что я понимаю, в типичном обмене открытым ключом HTTPS, браузер и сервер объединяются с ключами для создания ключа сеанса... если кто-то когда-либо получал закрытый ключ, который выводил ключ сеанса, они могли видеть все данные, которые было отправлено между этой связью, даже в прошлом.

Я понимаю, что с PFS "сеансовый ключ" никогда не отправляется даже в зашифрованном виде. Он хранится в секрете, так что даже если кто-то найдет закрытый ключ, они не смогут получить доступ к зашифрованной записанной информации из прошлого. Правильно ли это?

Мне также интересно, если я принимаю участие в обмене PFS, позвоните мне "A", с сервером "B", PFS должен работать с тем фактом, что если мой ключ станет скомпрометированным, A и B-разговор не станет скомпрометированы, потому что они не знают ключ сеанса. Но как "B" аутентифицирует меня как "A", если мой ключ фактически стал скомпрометированным... например. как бы он знал разницу между мной (A) или другим пользователем (C), используя мой ключ, пытающийся получить доступ к данным.

Ответ 1

В сеансе, отличном от PFS, браузер определяет ключ сеанса (или, скорее, секрет, из которого он получен), и шифрует его с помощью RSA с открытым ключом RSA, полученным из сертификата, принадлежащего серверу. Сертификат также используется для аутентификации сервера. Затем сервер использует свой закрытый ключ (то, что вы называете основным ключом) для дешифрования ключа сеанса. Все подключения к серверу используют разные ключи сеанса, но если у вас есть главный ключ, вы можете понять их все, как это делает сервер. В PFS вы используете такие алгоритмы, как Diffie-Hellman, где главный ключ не используется. В этом случае мастер-ключ используется для аутентификации параметров для алгоритма. После согласования параметров обмен ключами происходит с использованием этих параметров и секрет обеих сторон. Параметры не секретны, и секреты, которые использовались сторонами, являются отбрасывателями после того, как ключ сеанса установлен (эфемерный). Таким образом, если вы обнаружите главный ключ, вы не сможете открыть ключ сеанса. Однако вы можете создать сервер, если вы получите ключ, а сертификат не будет признан недействительным. Чтобы узнать больше о Диффи-Хеллмане.

Ответ 2

Мне очень нравится ответ на Quora, который дал Роберт Лав: http://www.quora.com/What-is-perfect-forward-secrecy-PFS-as-used-in-SSL

Посмотрим, как работает обмен ключами в общем нефемерном случае. Вместо того, чтобы давать практический пример, используя, скажем, Диффи-Хеллман, я дать обобщенный пример, где математика проста:

Алиса (клиент) хочет поговорить с Бобом (сервером).

Боб имеет закрытый ключ X и открытый ключ Y. X является секретным, Y является общедоступным.

Алиса генерирует большое случайное целое число M.

Алиса шифрует M с помощью Y и отправляет Y (M) в Боб.

Боб расшифровывает Y (M) с помощью X, получая M.

И у Алисы, и у Боба теперь есть M и использовать его как ключ к любому шифру, который они согласились использовать для сеанса SSL, например AES.

Довольно просто, не так ли? Проблема, конечно, в том, что если кто-либо когда-либо узнает X, каждое отдельное сообщение скомпрометировано: X позволяет злоумышленнику расшифровать Y (M), уступая M. Давайте посмотрим на версию PFS этого сценария:

Алиса (клиент) хочет поговорить с Бобом (сервером).

Боб генерирует новый набор открытых и закрытых ключей, Y 'и X'.

Боб посылает Y 'Алисе.

Алиса генерирует большое случайное целое число M.

Алиса шифрует M, используя Y ', и отправляет Y' (M) в Боб.

Боб расшифровывает Y '(M) с помощью X', получая M.

И у Алисы, и у Боба теперь есть M и использовать его как ключ к любому шифру, который они согласились использовать для сеанса SSL, например AES.

(X и Y по-прежнему используются для проверки подлинности, я оставляю это.)

В этом втором примере X не используется для создания общего секрета, поэтому даже если X становится скомпрометированным, M не подлежит обнаружению. Но вы просто подтолкнули проблему к X ', вы можете сказать. Что, если X 'станет известно? Но это гений, говорю я. Предполагая, что X 'никогда не используется повторно и никогда не хранится, единственный способ получить X' - это если противник имеет доступ к памяти хоста во время связи. Если ваш противник имеет такой физический доступ, то шифрование любого рода не принесет вам никакой пользы. Более того, даже если X 'было каким-то образом скомпрометировано, оно будет раскрывать только это конкретное сообщение.

Это PFS.