Я пытаюсь передать строку JSON из одного веб-приложения в другое, используя параметры URL (для внутреннего сервера единого входа).
Что мне нужно сделать, так это иметь возможность зашифровать строку JSON (которая является объектом полезной нагрузки пользователя) с помощью предварительно общего ключа, перенаправить пользователя в приложение поставщика услуг с полезной нагрузкой, присоединенной в качестве параметра URL, а затем в поставщика услуг приложение расшифровывает полезную нагрузку обратно в строку JSON, чтобы получить необходимую информацию.
Теперь эта часть не так важна благодаря всем встроенным в PHP функциям шифрования, но следующая часть связана с трудностями. Мне нужно встроить контрольную сумму в зашифрованную строку, которую можно проверить при расшифровке, чтобы, если она была изменена при передаче, я мог вызвать исключение.
Цель этого состоит в том, чтобы удостовериться, что пользовательская полезная нагрузка не была изменена в пути ни случайно, ни преднамеренно.
Вы хотите предоставить больше, чем «контрольная сумма» (обычно определяемая как «рассчитываемая любой стороной»); Вы хотите предоставить тег аутентификации или код аутентификации сообщения (MAC). У вас есть пара вариантов:
hash_equals
сделать это. Вот быстрое объяснение времени атаки и обзор кода примера PHP. В любом случае вы захотите закодировать полученный зашифрованный текст и тег аутентификации с URL-безопасным Base64, чтобы избежать потери или повреждения данных. Если формат вашего сообщения не имеет строгой структуры с включенными длинами, вам придется заранее поделиться протоколом заранее (т.е. для сообщения м длины N байт -> 16 bytes IV | n-48 bytes cipher text | 32 bytes HMAC
).
Последнее примечание: всегда используйте уникальный, непредсказуемый IV для каждого сообщения, которое зашифровано ключом. Многие люди игнорируют это, потому что «просто использовать 0x00
* 16 «, но любой режим работы потокового шифра вроде CTR
используемый в качестве основы GCM и CCM потеряет фундаментальную безопасность, если два сообщения будут зашифрованы с одним и тем же IV и ключом.
Других решений пока нет …