Невозможная ситуация аутентификации?Требуется подсказка для алгоритма - PullRequest
5 голосов
/ 17 октября 2011

Это ситуация:

Сервер или клиент может быть доверенным (оба запускаются на компьютерах пользователей). Доверенные пользователи имеют секретный ключ на своем компьютере вместе с клиентом. Целью алгоритма является аутентификация доверенных пользователей как доверенных на сервере без предоставления секретного ключа серверу.

Технические трудности:

Язык, который мы используем (Game Maker), не такой быстрый и точный. У нас есть готовая реализация хеширования MD5, но у меня и у команды нет времени на реализацию невероятно сложных криптоалгоритмов.

Ответы [ 4 ]

3 голосов
/ 17 октября 2011

Вы можете создать один секрет для каждого сервера, используя только MD5.Я не уверен, что это правильно, поэтому не поверьте мне на слово.

Каждый сервер имеет уникальный идентификатор, который может быть открытым, а также локальный секрет, равный MD5(trusted secret + unique ID) или подобный.Вам нужно будет передать локальный секрет на сервер по какому-либо внешнему безопасному каналу, но, например, если он загружен с сайта одной компании по протоколу HTTPS вместе с кодом сервера, и если вы убедитесь, что никогда не отправляете локальный секрет длязаданный уникальный идентификатор более одного раза, тогда я думаю, что все в порядке.

Сервер может затем отправить свой идентификатор клиенту вместе с идентификатором сервера.Доверенный клиент может сгенерировать MD5(trusted secret + unique ID) для себя, но ненадежный клиент не может сгенерировать его.Это дает серверу и доверенному клиенту общий секрет, который можно использовать для аутентификации с использованием (например) HMAC-MD5.

Если утечка локального секрета, то только ненадежным клиентам предоставляется возможность обмануть это.негерметичный сервер, а не другие серверы.

Очевидно, что у этого есть недостатки - например, MITM между сервером и доверенным клиентом может обеспечить правильный ответ на любой вызов, который делает сервер, не зная никаких секретов.Но он не раскрывает секрет клиента серверу и не раскрывает секрет сервера клиенту, поэтому он несколько лучше, чем ничего.

У него также есть криптографические недостатки - MD5 несколько сломан.Если я сервер и могу найти x такой, что MD5(x + my_id) == my_secret, то скорее всего x является секретным ключом.Я не знаю, насколько вычислительно возможно найти x с учетом одного или нескольких локальных секретов: это зависит от текущей степени поломки MD5.

Я думаю, что MITM абсолютно неизбежен, учитывая ваши ограниченияхотя я могу ошибатьсяДоверенный клиент не имеет возможности отличить один сервер от другого, в частности, использует ли сервер свой уникальный уникальный идентификатор, и поэтому всегда будет давать правильные ответы на любые вызовы, которые проходит MITM.Однако, при условии, что в сообщениях есть какое-то значение, которое злоумышленник не может контролировать, например, сгенерированный сервером одноразовый номер или дата, простое прослушивание не приводит к атакам воспроизведения.Я не знаю, как предотвратить MITM без использования асимметричного шифрования и PKI, то есть различных базовых крипто-строительных блоков, которые у вас нет времени / возможностей для реализации на вашем языке.

Можно сделать так, чтобы система обеспечивала отзыв ключа.Если вы настроите полномочия своей компании на выдачу пар (random server ID, local secret) по требованию, то серверы могут время от времени обновлять свой локальный секрет (и одновременно менять свой идентификатор).Затем вы можете изменить доверенный секрет, и серверы прекратят аутентификацию клиентов, использующих старый, и начнут аутентификацию клиентов, использующих новый, как только они получат следующий идентификатор.Как уже говорилось, это довольно болезненная передача, вы, вероятно, захотите немного смягчить ее, если строите такую ​​схему.

1 голос
/ 17 октября 2011

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

Эта схема не поддерживает отзыв, что является серьезной проблемой, если вы не можете доверять своим «доверенным» пользователям не раскрывать секрет.

0 голосов
/ 18 октября 2011

Что ж, если вам не нужна сверхзащищенная система, тогда сервер или пользователь должны «спросить»: Am I trusted? Тем не менее, вам нужно как-то доверять пользователю. Простой способ - когда пользователь добавляет свой ключ или он генерируется, он посылает некоторый сигнал на сервер, который: OK, I have validated, please remember that im trusted and here you go, the special passprase to check that: *Apple*. I should answer *Pear*. А затем, когда пользователь подключается к серверу, сервер запрашивает: Apple?, а клиент отвечает: Pear!. Сервер авторизует клиента. Работает в обе стороны. Тем не менее, если вам нужно гораздо лучшее решение, вам понадобится центральный сервер, ведьма выдаст:

  • Вопрос к серверу
  • Ответ клиенту
  • Подтверждает клиентский ключ
0 голосов
/ 17 октября 2011

Вы не должны проектировать свою собственную криптосистему. Найдите существующую и перенесите ее.(Даже это может подвергнуть вас таким вещам, как временные атаки ...)

Позвольте мне продемонстрировать, как легко совершить ошибку.Вот базовая схема аутентификации:

  • Использование RSA с открытыми ключами с цифровой подписью, которым вы доверяете
  • Сервер отправляет случайный запрос клиентам, которые предоставили подписанный открытый ключ
  • Клиент отвечает личным зашифрованным вызовом
  • Сервер проверяет путем расшифровки до исходного значения
  • Ненадежные клиенты не могут пройти проверку подлинности, поскольку у них нет личного ключа для подписанного открытого ключа

Кажется безопасным, верно?Нет.

  • Сервер контролирует значение запроса.Вредоносный сервер может выполнить атаку «человек посередине» между подключающимся клиентом и другим сервером, чтобы идентифицировать себя как доверенного клиента для другого сервера.
  • Нет механизма отзыва.Что если доверенный пользователь публикует свой закрытый ключ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...