Вместо того, чтобы реализовывать собственную процедуру шифрования, я бы порекомендовал передавать ваши данные json с сервера 2 по протоколу https, который позаботится о шифровании.
Обратите внимание, что вам не нужно приобретать сертификат, вы можете самостоятельно подписать сервер2 и установить curl на сервере server1, чтобы разрешить "небезопасное" соединение https (незащищенный означает, что сертификат не является доверенным, но данные по-прежнему зашифрованы).
Для белого списка, которому разрешено запрашивать данные с сервера 2, белый список по ip, если вы можете. Другим способом (или в дополнение) может быть простая система подписи с общим секретом.
В качестве иллюстрации, установите настраиваемый заголовок http, когда сервер 1 делает запрос (скажем, «Моя подпись»), и используйте «алгоритм» настройки вашей подписи (простой пример в php ниже):
$sig = sha1($user_agent
. $date_header_value
. $http_request_path
. $http_query_string
. $http_raw_post_payload
. $shared_secret);
Затем вы можете настроить заголовок запроса:
My-Signature: $sig
Вы можете сделать свою систему подписи настолько сложной, насколько захотите. Идея состоит в том, что server2 знает один и тот же сигнатурный «рецепт», может извлекать все необходимые поля из заголовков запроса, строки запроса и полезной нагрузки post и использовать общий секрет для вычисления подписи на своей стороне.
Сравните вычисленную подпись с подписью, переданной в заголовке My-Signature, и обработайте запрос, если они совпадают. Если нет, откройте страницу ответа 403.