Использование HTTPS в Java без шифрования

Мы ищем решение, которое позволит нам использовать HTTPS без шифрования. Почему? Вот история:

Наш продукт (установленный в клиентах) подключения к нашим серверам для выборки обновлений, разместите информацию и т.д. Мы хотим, чтобы продукт проверил, что подключен к серверу (и не самозванец) до регистрации данных. Мы также должны удостовериться, что нет никаких атак "человек посередине" (то есть, содержание должно быть подписано, и т.д.). Однако наши клиенты требуют, чтобы они могли осуществить сниффинг трафика (Wireshark, tcpdump, и т.д.) и просмотреть контент всей транзакции. Это для соответствия и соображений безопасности.

Наш продукт записан в Java, между прочим.

Какие-либо идеи?

ОБНОВЛЕНИЕ: извините меня, если я не использую правильную форму для ответа на ответы, я являюсь довольно новым на этом сайте.

В первую очередь, спасибо за Ваши быстрые ответы!

Наша причина исследования возможности HTTPS состоит в том, потому что мы не хотим изобретать новый протокол здесь. Это не просто объем работы, но также и то, что изобретение Вашего собственного протокола системы защиты (даже если только для подписания) обычно считают плохой практикой. Мы пытаемся получить преимущества HTTPS в аутентификации сервера (который важен, этот сервер также вручает исполняемый код, который может быть довольно большим - мы не хотим никого вручающего вредоносное программное обеспечение или DoSing наши клиенты с большими данными, которые только после получения всей вещи будут система узнавать, что это плохо), а также гарантирующий, что MITM не происходит (подписание самих сообщений). Мы не возражаем, если любой evesdropes на трафике, потому что он никогда не содержит что-то конфиденциальное считаемое. Кроме того, должно не обязательно быть легко считать содержание в Wireshark, только возможном, таким образом, аудиторы могут сделать это.

@Nate Zaugg - нет, это не шутка. На самом деле удивительно, что поставщики используют HTTPS с шифрованием сегодня и не получают много обратной реакции от клиентов со строгими проблемами соответствия.

@erickson - первое решение с ПУСТЫМИ исками шифра выглядит интересным, мы изучим его. Второе решение потребует ряда ключей для каждого клиента - не что-то, чем мы хотели бы управлять.

Кодер @ZZ - Вы подразумеваете, что с пустыми шифрами не будет возможно просмотреть содержание в Wireshark?

5
задан Yon 29 June 2010 в 21:03
поделиться

5 ответов

Существуют «наборы шифров» SSL без шифрования, и все версии поставщика Sun JSSE поддерживают SSL_RSA_WITH_NULL_SHA . Однако все данные приложения по-прежнему заключены в записи SSL (для переноса MAC, который обеспечивает защиту целостности и т. Д.), Поэтому, если вы посмотрите на них в Wireshark, вы увидите эти структуры.

В качестве альтернативы, если вы не используете эфемерный алгоритм Диффи-Хеллмана (один из DHE_XXX наборов шифров), вы можете предоставить Wireshark закрытый ключ сервера, и он расшифрует сеанс SSL. Хотя это дополнительная работа, она не предъявляет никаких необычных требований к серверу или клиенту по поддержке редко используемых незашифрованных наборов шифров.

9
ответ дан 18 December 2019 в 11:52
поделиться

Если вам нужна только подпись, почему вы не можете просто подписывать каждый ответ закрытым ключом (помещая подпись в заголовок) и проверять его с помощью публичный ключ на клиенте, но вообще не использовать HTTPS? Пока ваш закрытый ключ остается в секрете и вы выбираете подходящий алгоритм подписи, это должно предотвратить подделку тела ответа, но без сохранения этого тела в секрете.

3
ответ дан 18 December 2019 в 11:52
поделиться

Я согласен с @Jon Skeet - вы не должны пытаться использовать поврежденный HTTPS, вместо этого вы должны просто подписать свои ответы. Вы можете посмотреть документацию по Amazon S3 , чтобы получить хороший пример прочной, надежной и в то же время довольно простой модели безопасности.

Короче говоря, основная идея состоит в том, чтобы иметь какой-то секретный ключ, добавить его, временную метку к вашему сообщению и хешировать это. Отправьте хэш и дату (но не секрет, очевидно) вместе с вашим сообщением на сервер. Затем ваш сервер проверяет, что дата достаточно близка, чтобы доверять (скажем, 15 минут), и хеширует запрос, дату и секретный ключ, которые у него есть в файле. Если он получает такой же хеш, значит, запрос был сгенерирован доверенным ресурсом, и сервер может безопасно продолжить работу.

Очевидно, что это небезопасно от сниффинга «злоумышленник посередине» (с которым вы, кажется, согласны), но это предотвратит изменение или создание фальшивых запросов MITM.

1
ответ дан 18 December 2019 в 11:52
поделиться

Вы можете попробовать использовать NULL-шифры (1 и 2), но большинство серверов настроено не принимать слабые шифры. Конечно, эти 2 шифра самые слабые.

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

0
ответ дан 18 December 2019 в 11:52
поделиться

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

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

0
ответ дан 18 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: