Я хочу реализовать некоторую эффективную (т.е. с хорошей производительностью) логику, которая подписывает полезные данные в нашем веб-приложении. Цель состоит в том, чтобы клиент HTML5 имел гарантию того, что содержимое полученной полезной нагрузки действительно соответствует тому, что было сгенерировано нашим бэкэндом.
Мы не хотим генерировать хэш полезной нагрузки с общей солью, потому что пользователь может легко открыть исходный код HTML5 и найти солевую фразу.
На данный момент мы внедрили подпись RSA, когда наш бэкэнд добавляет подпись полезной нагрузки, используя свой закрытый ключ, а наш клиент HTML5 проверяет ее, используя запеченный открытый ключ. Однако процесс генерации подписи занимает 250 мс (для относительно небольшой полезной нагрузки), и из-за характера подписанного запроса это время неприемлемо.
Единственная другая идея состоит в том, чтобы генерировать общий секрет во время выполнения каждый раз, когда клиент инициализирует свой сеанс с серверной частью. Однако секрет не может быть отправлен в виде открытого текста, поэтому, похоже, нам придется реализовать механизм обмена Диффи-Хеллмана, чего мы хотели бы избежать, если это возможно, или автоматизировать с помощью существующих библиотек.
Помните, что секретность и шифрование должны выполняться на прикладном уровне из-за того, как мы продаем наш продукт. Мы не собираемся шифровать наш трафик, это то, что наши клиенты могут или не могут реализовать (поскольку это приложение для интрасети). Тем не менее, мы должны избегать раскрытия им информации, связанной с нашими механизмами проверки лицензий и т. д. Серверная часть не основана на облаке и не контролируется нами, а устанавливается на компьютерах клиентов локально.
Фронтенд — это Javascript, а бэкэнд — Java.