Как аутентифицировать клиента на основе владения симметричным ключом?

Наши клиенты вызывают наш веб-сервис через SSL и аутентифицируют себя с помощью имени пользователя и пароля. Затем наш сервер генерирует симметричный ключ и отправляет его обратно клиенту.

Затем клиент устанавливает TCP-соединение с нашим сервером и отправляет сообщение для входа. На этом этапе я хочу аутентифицировать клиента.

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

Поскольку симметричный ключ генерируется случайным образом, можно ли использовать здесь статический фрагмент текста?

Любой вклад приветствуется.


person Lars A. Brekken    schedule 30.06.2010    source источник


Ответы (2)


SSL создан для аутентификации как клиента, так и сервера, а асимметричная криптография является наиболее безопасным примитивом, который вы можете использовать в этом сценарии. Симметричные шифры можно использовать для аутентификации с помощью кода аутентификации сообщения с цепочкой блоков шифрования. известный как режим CBC-MAC. Использование CBC-MAC имеет такую ​​же защиту, как и HMAC, но использует симметричный шифр вместо функции дайджеста сообщения. Режим CBC-MAC используется WPA для защиты беспроводных сетей.

person rook    schedule 30.06.2010
comment
Спасибо за ваш ответ. Я использую .NET 2.0, и похоже, что CBC-MAC поддерживается только с версии 3.5 (blogs.msdn.com/b/shawnfa/archive/2009/03/17/). Я хотел бы использовать CBC-MAC или создать MAC с использованием хэш-алгоритма и добавить его к сообщению, но сообщение о входе содержит очень мало информации (в основном только имя пользователя), и я подумал, что это может создать слабость. Возможно, я ошибаюсь. - person Lars A. Brekken; 30.06.2010
comment
@ Ларс А. Бреккен Я уверен, что есть другая реализация в ASP или C # (или что-то еще, что вы используете). Было бы не так сложно создать свой собственный, а затем проверить его на соответствие реализации .net 3.5. - person rook; 30.06.2010
comment
@ Ларс А. Бреккен, если вы используете хэшированный Mac, вам все равно нужно использовать секрет. Это может быть передано через SSL, аналогично идентификатору сеанса. - person rook; 30.06.2010

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

Принятый способ сделать это — вызов/ответ. Клиент подключается, сервер генерирует случайный запрос и отправляет его клиенту, а клиент отвечает зашифрованной версией запроса (хотя на самом деле вам следует использовать здесь HMAC, а не блочный шифр, потому что в противном случае ваш клиент эффективно одноблочный оракул расшифровки!). Также было бы безопаснее использовать два разных случайных ключа (предоставляемых одновременно через веб-службу), один для шифрования и один для аутентификации.

Однако обратите внимание, что эта схема, как написано, по-прежнему подвержена атаке «человек посередине». Вам определенно лучше использовать SSL, так как >Ладья предполагает. Это потребует, чтобы ваш клиент сгенерировал открытый ключ и отправил его веб-службе. Веб-служба отвечает подписанным сертификатом, содержащим открытый ключ клиента вместе с уникальным идентификатором клиента (имя пользователя или что-то еще) в поле DN. Сервер в отдельном соединении проверяет используемый сертификат клиента (убедившись, что он подписан вашей веб-службой) и проверяет, соответствует ли идентификатор клиента в сертификате клиенту, который запрашивает подключение.

person caf    schedule 01.07.2010