Эффективный способ сделать подпись полезной нагрузки в HTML5 SPA - PullRequest
0 голосов
/ 01 апреля 2019

Я собираюсь реализовать некоторую эффективную (т.е. с хорошей производительностью) логику, которая выполняет подписывание полезной нагрузки в нашем веб-приложении. Цель состоит в том, чтобы клиент HTML5 имел гарантию того, что содержимое полученной полезной нагрузки действительно является тем, которое было сгенерировано нашим бэкэндом.

Мы не хотим создавать хэш полезной нагрузки с разделяемой солью, потому что пользователь может легко открыть исходный код HTML5 и найти солт-фразу.

На данный момент мы внедрили подпись RSA, когда наш бэкэнд добавляет сигнатуру полезной нагрузки, используя свой закрытый ключ, а наш клиент HTML5 проверяет ее, используя свою запеченную в открытом ключе. Однако процесс создания подписи занимает 250 мс (для относительно небольшой полезной нагрузки), и из-за характера подписанного запроса это количество времени неприемлемо.

Единственная другая идея - генерировать общий секрет во время выполнения каждый раз, когда клиент инициализирует свой сеанс с бэкэндом. Однако секрет не может быть отправлен в виде открытого текста, поэтому нам, похоже, придется реализовать механизм обмена Диффи-Хеллмана, чего мы хотели бы избежать, если это возможно, или автоматизировать его с помощью существующих библиотек.

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

Интерфейс - это Javascript, а бэкэнд - это Java.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

В итоге мы использовали TweetNaCl как на стороне клиента, так и на стороне сервера. Библиотека предоставляет простой и быстрый способ сделать общий секретный обмен в стиле DH без специальной реализации. С эфемерным общим секретом мы можем легко генерировать хэши вместо подписей для наших полезных нагрузок, уменьшающихся с 250 мс до 10 мкс. Также RSA, подписывающая первоначальный обмен DH, важна и является единственным местом, где мы используем RSA.

Пожалуйста, прочитайте @AlexandreFenyo ответ для правильной теории о том, как обычно обрабатывает такие случаи.

0 голосов
/ 08 апреля 2019

Обратите внимание, что механизм обмена Диффи-Хеллмана не защищен от атаки MITM, поэтому отсутствие шифрования трафика означает, что вам необходимо аутентифицировать данные DH, поступающие с сервера. Вот почему веб-сервер, использующий набор шифров на основе DH, подписывает элементы DH, отправленные по сети, с помощью закрытого ключа своего сертификата сервера, чтобы клиент мог проверить, действительно ли эти элементы получены с сервера, к которому он хочет подключиться. Эти элементы общедоступны, но должны быть подписаны.

То, что вы называете «генерацией хэша полезной нагрузки с разделяемой солью», является кодом аутентификации сообщения с хеш-ключом, поэтому, как вы заметили, он основан на общем секрете, и, поскольку вы не хотите использовать этот механизм, это означает, что Вы не доверяете клиенту. Поэтому для подписи полезной нагрузки необходимо использовать асимметричную криптографию.

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

Вы говорите о процессе генерации подписи, но процесс проверки подписи на стороне клиента также очень важен в вашем случае, потому что общее время, которое пользователь должен ждать результата, - это добавление времени для подписи и время для проверки подписи (более того, подпись часто может ожидаться на сервере, если подписываемые данные не генерируются динамически, но никогда нельзя ожидать проверки). Поэтому вам нужен быстрый способ проверки подписи на стороне клиента. Сначала подпишите хеш, а не всю полезную нагрузку. Затем выберите самый быстрый алгоритм асимметричной подписи, который доступен в вашей среде разработки на стороне клиента. Обратите внимание, что проверка подписи RSA выполняется быстрее, чем проверка подписи DSA или ECDSA, для соответствующей длины ключей, соответствующей тому же уровню безопасности. Так что вам стоит остаться с RSA.

Все это, пока эта строка не может вам так сильно помочь! Теперь есть способ повысить производительность, используя RSA для подписи и проверки подписей, и этот способ довольно похож на тот, который реализует SSL / TLS для увеличения производительности браузера при загрузке нескольких страниц или других объектов с одного сервера: использует кеш сессии . Вы делитесь общим секретом для определенного сеанса с одним конкретным пользователем. Никогда не используйте этот общий секрет для других сессий. Когда пользователь подключается в первый раз, используйте RSA только один раз, чтобы обменяться эфемерным общим секретом или обменяться материалами DH для создания этого общего секрета. Затем каждый раз, когда серверу необходимо подписать объект, он создает код аутентификации сообщения с хеш-ключом с этим конкретным секретом. Поэтому, если пользователь находит секрет, например, используя режим отладки своего браузера, это не проблема: этот секрет предназначен только для того, чтобы помочь ему узнать, что то, что исходит от сервера, не было изменено. Поэтому пользователь не может использовать этот секрет для изменения обмена данными между сервером и другими пользователями.

...