Предотвратите атаки воспроизведения с помощью открытого / закрытого ключа шифрования параметров HTTP GET с использованием Mcrypt и PHP
Я хочу создать игровое приложение, для этого я хочу, чтобы клиент отправлял на сервер оценки и другую информацию, которая должна быть зашифрована.
Я понял, что есть способ mcrypt
шифровать данные с помощью открытых и закрытых ключей. поэтому приложение на стороне клиента будет шифровать, но я единственный, кто сможет его расшифровать. У меня не так много информации для продолжения, я просто хочу знать наиболее безопасный способ вставки данных.
То, что я понял до сих пор, это пример:
если у меня есть: ?username=foo&score=50&msg=hello
Я могу зашифровать его для: msgencrypted=fgus9g8uywe978ygt7923y5235sdfdsadfsd
(пример)
и только с определенным ключом, который у меня есть на моем сервере, я могу расшифровать его.
Опять же, я просто пытаюсь найти лучший способ скрыть данные от пользователя, чтобы он не смог их расшифровать.
это означает, что если я зашифровал сообщение... это сообщение не сможет быть отправлено дважды.
Так что, если пользователь использовал firebug, чтобы увидеть, какой запрос был отправлен, и попытается отправить его снова, сообщение будет недействительным. Я думаю, я могу просто записать это в базу данных. Но если есть метод для такой вещи, это было бы здорово.
Я использую PHP 5.4.
1 ответ
Вы должны использовать PKI (инфраструктура открытых ключей). Криптография с открытым ключом (асимметричная криптография AKA) относится к криптографическому алгоритму, который требует двух отдельных ключей (пары ключей), один из которых является секретным (или закрытым), а другой - открытым ключом.
Ваш клиент имеет доступ к открытому ключу и шифрует сообщение, используя открытый ключ, и только сервер, имеющий доступ к закрытому ключу, может расшифровать сообщение. Допустим, вы можете зашифровать результаты и другую информацию с помощью алгоритма RSA и отправить ее на сервер. Таким образом, вы предотвращаете изменение параметров. Вы также можете использовать MAC (код аутентификации сообщения) для предотвращения взлома.
Но я рекомендую размещать данные вместо использования GET; потому что обычно URL-адреса будут зарегистрированы на веб-серверах или интернет-провайдерах. Поэтому разумно не помещать конфиденциальные зашифрованные данные в строки запроса.
Для предотвращения повторных атак вы можете использовать счетчик и отправить его по параметрам. на стороне сервера вы сохраняете значение последнего счетчика (например, 123). Когда вы получаете запрос, значение его счетчика которого равно или меньше сохраненного значения, вы должны отклонить запрос. например, когда вы получаете запрос со значениями счетчика<=123. Поскольку вы шифруете все параметры, никто не может также изменить значение счетчика.
На самом деле POS-терминалы используют аналогичный подход для предотвращения повторных атак. Если вы хотите более высокий уровень безопасности, попробуйте прочитать о безопасности транзакций POS и о том, как транзакции защищены от атак "воспроизведение в середине".