(no subject)
Sep. 24th, 2014 02:09 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Пришла в голову одна идея, поцарила и скончалась, не выдержав столкновения с жестокой реальностью. Бедняжку жаль, поэтому хочется почтить её память, озадачив вас небольшой криптографической загадочкой.
Итак, вот есть обычный SSL. Допустим, юзер заходит на сайт, сайт отсылает браузеру сертификат, тот проверяет, что сертификат подлинный, имя сайта совпадает с указанным. Всё ок. Теперь сайту надо доказать, что он впрямь владелец сертификата. Делается так: браузер генерит какое-то случайное значение, шифрует публичным ключом из сертификата, отсылает сайту. Сервер расшифровывает его своим секретным ключом и использует это значение в дальнейших операциях, тем самым доказывая, что и вправду обладает ключом, парным тому, что заверен сертификатом. Классика жанра, введение в асимметричную криптографию. Подробности того, как именно это происходит в SSL, можно до мельчайших деталей узнать из этого замечательнейшего поста.
Теперь: у клиента есть возможность в свою очередь предъявить свой сертификат, чтобы сайт его опознал. Логично было бы предположить, что доказательство владения этим сертификатом происходит схожим образом: сайт шифрует публичным ключом нечто случайное, браузер его расшифровывает ключом секретным, и тем доказывает, что клиент - и вправду хозяин предъявленного.
Но вместо этого из святого писания мы узнаём, что на деле происходит нечто совсем другое. Сервер не отсылает ничего. Клиент же просто берёт все сообщения, которыми обменялся с сервером с начала переговоров и до этого момента, вычисляет по ним хэш, шифрует его секретным ключом и отсылает. Сервер же расшифровывает его публичным и сравнивает со своим хэшем, вычисленным тем же образом. Если совпало - всё ок.
Внимание, вопрос: какая довольно-таки забавная, но неочевидная атака стала бы возможной, если бы дела обстояли так, как я сгоряча предположил?

Итак, вот есть обычный SSL. Допустим, юзер заходит на сайт, сайт отсылает браузеру сертификат, тот проверяет, что сертификат подлинный, имя сайта совпадает с указанным. Всё ок. Теперь сайту надо доказать, что он впрямь владелец сертификата. Делается так: браузер генерит какое-то случайное значение, шифрует публичным ключом из сертификата, отсылает сайту. Сервер расшифровывает его своим секретным ключом и использует это значение в дальнейших операциях, тем самым доказывая, что и вправду обладает ключом, парным тому, что заверен сертификатом. Классика жанра, введение в асимметричную криптографию. Подробности того, как именно это происходит в SSL, можно до мельчайших деталей узнать из этого замечательнейшего поста.
Теперь: у клиента есть возможность в свою очередь предъявить свой сертификат, чтобы сайт его опознал. Логично было бы предположить, что доказательство владения этим сертификатом происходит схожим образом: сайт шифрует публичным ключом нечто случайное, браузер его расшифровывает ключом секретным, и тем доказывает, что клиент - и вправду хозяин предъявленного.
Но вместо этого из святого писания мы узнаём, что на деле происходит нечто совсем другое. Сервер не отсылает ничего. Клиент же просто берёт все сообщения, которыми обменялся с сервером с начала переговоров и до этого момента, вычисляет по ним хэш, шифрует его секретным ключом и отсылает. Сервер же расшифровывает его публичным и сравнивает со своим хэшем, вычисленным тем же образом. Если совпало - всё ок.
Внимание, вопрос: какая довольно-таки забавная, но неочевидная атака стала бы возможной, если бы дела обстояли так, как я сгоряча предположил?
