Безопасность, криптография: Глупый протокол «Вызов — ответ»?

#security #cryptography #challenge-response

Вопрос:

Ладно, ребята, просто небольшая игра:

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

КЛИЕНТ ----------------------------- СЕРВЕР

(1)попросите о вызове -------------->

(2) 
 (это и есть вызов)
(3) сделайте ПАРОЛЬ SHA1 xor - - - - - - - ->, если он равен сохраненному паролю SHA1 xor

(4) 

Для тех, кто не знает, что SHA расшифровывается как Алгоритм безопасного хеширования, стандартный алгоритм криптографии.

Я надеюсь, что это ясно. Вопрос в следующем: если я обнюхаю пакеты 2 и 3 («вызов» и «пароль xor вызова»), у меня будет фактический пароль только с другим xor между ними обоими!?!? Есть ли другой способ реализовать такой протокол??

Ответ №1:

Вы могли бы перепроектировать пароль. Вы хотите отправить текст пароля, а не сам пароль. Прокручивать свои собственные протоколы безопасности почти никогда не бывает хорошей идеей. Вы не можете использовать SSL или что-то подобное?

http://en.wikipedia.org/wiki/Cryptographic_nonce

Комментарии:

1. Nonces подобны временным солям 🙂

Ответ №2:

Как насчет следующего:

  1. Сервер отправляет случайный вызов
  2. Клиент отправляет контрольную сумму SHA1 (вызов пароль)
  3. Серверы сравниваются с контрольной суммой SHA1 (вызов сохраненный пароль)

Ответ №3:

Это довольно ужасный протокол. Если это то, что кто-то хочет, чтобы вы реализовали, откажитесь от этого. Существуют существующие, проверенные протоколы для такого рода вещей. Если это игра, в которой вы указываете на все недостатки — хорошо.

  • Любой, кто слышит шаги 2 и 3, знает пароль
  • Любой, кто слышит шаг 3 и отмечает время, может ввести пароль методом перебора, если у него есть какое-либо представление о точности времени на сервере
  • Я могу притвориться сервером (отравление arp, изменение dns и т. Д.) И получить ваш пароль, никогда не завершая шаг 4 и симулируя тайм-аут
  • Уязвим для атак «Человек посередине», потому что на сервере нет общего секрета между клиентом/сервером или сертификатами
  • Полагается на сервер, хранящий SHA1(время) и ожидающий ответа, поэтому я могу перегрузить сервер запросами о вызовах и никогда не отвечать.

И мне определенно не хватает еще кое-чего.

Ответ №4:

Вы правы-если вы поймаете вызов и (вызовите пароль XOR), то извлечь пароль будет легко.

Вам нужно использовать правильное шифрование на шаге 3, а не XOR. Зашифруйте вызов паролем.

Чтобы усложнить жизнь злоумышленнику, вы можете добавить случайные данные в то, что вы шифруете: например, зашифровать paddingCHALLENGEpadding. Серверу все равно, что такое заполнение, он знает, где искать проблему, но это означает, что злоумышленник не будет знать, что такое весь открытый текст.

Комментарии:

1. Это предсказуемая модель, которую можно использовать. Не очень хорошая идея.

2. безопасность через неизвестность — это вовсе не безопасность

3. В вопросе я не вижу, где важна часть SHA1 — проблема может быть любой. Вам не нужно отменять хэширование, если я не неправильно понимаю описание. Где же часть безвестности? Добавление отступов-это то же самое, что использование соли при хранении пароля для предотвращения известных атак с открытым текстом.

4. Проблема в том, что xor по своей сути обратим. Если у вас есть pw^s1hash и s1hash отдельно, вы можете восстановить pw, выполнив pw^s1hash^s1hash, чтобы отменить исходное значение xor. (^ вот операция xor)

5. @pabloh84: если вы замените xor, скажем, на SHA1, то вы просто сделаете то же самое SHA1 с обеих сторон. Как указывали другие, вам нужна односторонняя операция (по крайней мере) вместо XOR.

Ответ №5:

Как указали другие, вы правы. Также имейте в виду, что кто-то может перехватить сообщение (3) и потенциально отправить его повторно, в то время как реальный пользователь испытывает проблемы с сетью (например, DDOS), самозванец затем войдет в систему, и часто этого достаточно для изменения пароля (то есть многие системы не требуют, чтобы вы указывали пароль, чтобы изменить его после входа в систему).

Возможно, вы захотите рассмотреть HMAC (код аутентификации хэш-сообщения с ключом). Я подробно написал об этом в блоге здесь: http://blog.ciscavate.org/2007/09/creating-a-secure-webauth-system-part-1-hmac.html и я приведу краткое резюме ниже.

HMAC-это метод обеспечения того, чтобы сообщение было сгенерировано кем-то, имеющим доступ к общему секрету. HMAC использует какую-то функцию одностороннего хеширования (например, MD5 или SHA-1) для шифрования секрета вместе с сообщением. Это генерирует короткий дайджест в 16-20 байт, который действует как отпечаток комбинации сообщение секрет. Когда дайджест отправляется вместе с сообщением, получатель (наш сервер) может повторно сгенерировать хэш с тем же вычислением HMAC и сравнить локально сгенерированный дайджест с дайджестом, который пришел вместе с сообщением. Помните: у сервера тоже есть секрет, поэтому у него достаточно информации для подтверждения дайджеста. (Здесь рассматривается только проблема проверки происхождения сообщения, но вы можете использовать тот же подход для шифрования всего сообщения, если используете другой секрет, скажем, набор открытых ключей.)

Ответ №6:

Я бы сделал это следующим образом:

  1. Бросьте вызов серверу.
  2. Сервер отвечает своим открытым ключом (например, для шифрования RSA) с цифровой подписью.
  3. Клиент проверяет PK и шифрует пароль с помощью ключа, затем подписывает зашифрованный пароль цифровой подписью.
  4. Сервер проверяет подпись и расшифровывает пароль, чтобы сохранить/проверить его.

Цифровая подпись здесь важна, поскольку она служит началом предотвращения атак «человек посередине».

Комментарии:

1. Это не предотвращает атаки man in the middle, так как человек в середине может заменить ключ клиента или сервера своим собственным, если у вас нет центра сертификации — в этом случае вы просто воссоздали SSL (и должны использовать его вместо этого).

Ответ №7:

Как отмечали другие, да, это плохой алгоритм реагирования на вызовы.

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

Ответ №8:

шифрование с открытым ключом? Используйте открытый ключ сервера для шифрования пароля.

Ответ №9:

Хотя это никогда не является хорошим решением для развертывания собственного криптографического протокола, и я бы этого не советовал….

Чтобы преодолеть проблему, с которой вы столкнулись… F — Функция, которая принимает пароль и псевдослучайное монотонно возрастающее значение и возвращает число. Например, для хэша(Хэш(Пароль) ^ Метка времени)

  1. Сервер : Запросите вызов, Отправьте (Отметка времени). Помните Последнюю Отправленную Метку Времени.
  2. Клиент, Отправьте ответ (Отправьте F(Пароль, метку времени) и Метку времени)
  3. Сервер: Проверьте клиента, используя Хэш(пароль) и метку времени, отправленную клиентом (> Метка времени, отправленная в вызове).
  4. Если клиент прав, предоставьте доступ.
  5. Убедитесь, что текущая метка времени больше, чем все метки времени, отправленные клиентом, перед следующим вызовом, чтобы предотвратить атаки с повторным воспроизведением.

С уважением, Ашиш Шарма

Ответ №10:

Я полагаю, что Диффи-хеллман-это хорошо известный и надежный протокол обмена ключами?