Идеи по усилению HTTP-трафика, чтобы он не воспроизводился - PullRequest
1 голос
/ 24 февраля 2012

У меня есть проект, в котором мне нужно совершать безопасные транзакции на веб-сервере HTTP.Я полностью контролирую клиента (мобильное приложение) и управляю сервером.Я хочу разработать систему, в которой клиент может добавить или вычесть значение, хранящееся в базе данных сервера.Сохраненное значение основано на валюте, поэтому важно, чтобы число было точным.Мой вопрос заключается в том, как я могу запретить кому-либо воспроизводить HTTP-трафик и удалять или добавлять значения по желанию.Кто-то может взять захват пакета от клиента, просмотреть параметры HTTP POST, необходимые для изменения значения валюты сервера, и просто воспроизводить эти пакеты, когда они захотят.

Первой моей мыслью было, чтобы клиент зашифровал новую валютузначение с открытым ключом, а затем сделать так, чтобы сервер расшифровал его с помощью закрытого ключа.Я также вставил бы временную метку и их имя пользователя вместе с новым значением валюты, прежде чем она будет зашифрована, поэтому запрос всегда будет другим.Затем сервер проверяет временную метку и отклоняет ее, если она прошла более 10 секунд.Одна из проблем этого подхода заключается в том, что клиент или сервер не синхронизированы по времени.Сервер будет синхронизирован с NTP, но нет никакой гарантии, что клиент будет правильным

Будут признательны за любые другие идеи.Я не ищу детали реализации низкого уровня, просто обзор высокого уровня.В идеале решение не будет слишком обременительным как для клиента, так и для сервера, поскольку скорость транзакций будет высокой.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Совет по общей безопасности: вы НЕ управляете клиентом, если он в дикой природе! Сервер должен проверить все, что отправляет клиент.

Простой поток:

  • Клиент подключается к серверу с именем пользователя / паролем через SSL, настраивая «сеанс».
  • Клиент отправляет команду (увеличить продукт X на сумму Y)
  • Сервер получает этот запрос через соединение SSL
  • Сервер проверяет, что запрос действителен, что зарегистрированный пользователь разрешено сделать это, выполняет команду и отправляет ответ клиент указывает на неудачу или успех.
  • Клиент отключается, отправляя сообщение «сеанс завершен» ( сессия также должна быть прервана после установленного периода).

Примечание: Все должно быть аутентифицировано и проверено на стороне сервера! Ваше клиентское приложение не должно отвечать за определение того, что является «действительным» запросом, а что нет - это работа сервера. Каждый запрос должен идти через SSL и должен выполняться только после успешного входа клиента в систему и начала сеанса. Даже с проверкой на основе временной метки кто-то может провести обратный инжиниринг вашего клиента или использовать атаку типа «человек посередине», но только если у них есть имя пользователя / пароль (или они могут перехватить данные законного клиента - трудно с SSL / система открытых / закрытых ключей). Если очень строгая защита обязательна, каждый запрос от клиента должен быть зашифрован RSA.

0 голосов
/ 24 февраля 2012

Вы должны просто использовать HTTP Secure

...