Какой самый простой способ выполнить шифрование с открытым ключом?
Самый простой для кого? Я думаю, что вы имеете в виду для человека из отдела кадров. Простейший протокол, который я вижу, может быть реализован так, что им нужно только дважды заходить на сайт без каких-либо дополнительных действий с их стороны.
Вам нужно будет создать нестатический сайт на вашем личном сервере, где вы достаточно уверены, что провайдер сервера не смотрит на жесткий диск сервера.
Давайте посмотрим шаги (детали реализации переплетаются с протоколом):
Создайте на своем сервере два загадочных URL-адреса и отправьте первый URL-адрес сотруднику отдела кадров (отныне получателю). Вы просите получателя позвонить вам после того, как он нажмет URL.
Получатель нажимает на URL, и происходит ряд вещей:
Сервер проверяет, был ли этот URL запрошен ранее, и покажет ошибку, если таковая была. В этом случае этот процесс должен быть начат снова.
Если это первый раз, когда URL вызывается, JavaScript генерирует пару ключей (открытый + закрытый).
Открытый ключ отправляется на сервер и сохраняется там, а закрытый ключ хранится в localStorage в браузере получателей.
Кроме того, браузер получателей генерирует случайную строку (называемую токеном), сохраняет ее в localStorage и отправляет на сервер, где она хранится.
Теперь получатель звонит вам. В это время вы спрашиваете их, была ли ошибка. Если его не было, вам нужно открыть второй загадочный URL-адрес, созданный на шаге 1. Этот загадочный URL-адрес связан с информацией, полученной от получателя на шаге 2, и содержит форму, в которой вы можете ввести свой SSN.
SSN шифруется с помощью сохраненного открытого ключа, а зашифрованный текст публикуется по третьему загадочному URL-адресу, основанному на маркере из шага 2.
Вы просите получателя снова щелкнуть ссылку и получить страницу с ошибкой, но эта страница с ошибкой быстро скрывается, поскольку в localStorage есть дополнительные значения, что означает, что это допустимый запрос. Браузер получателя делает следующее:
Он извлекает токен из localStorage и запрашивает зашифрованный текст.
Он извлекает закрытый ключ из localStorage и расшифровывает зашифрованный текст.
Он отображает SSN.
Этот протокол решает проблему, заключающуюся в том, что SSN никогда не хранится в открытом виде на сервере, и если кто-нибудь щелкнет ссылку до или после предполагаемого получателя, он ничего не увидит. Хотя это может быть уязвимо для перехвата SSL злоумышленником, и существуют точки входа для социальной инженерии.
Вы можете немного улучшить это, используя длинные опросы или веб-сокеты, если вы не хотите, чтобы получатель нажимал URL-адрес во второй раз.
Если вы имеете в виду самое простое для вас, то вам нужно либо поставить под угрозу безопасность, либо пойти в их офис лично.
Вы не должны использовать JSEncrypt для этого. Было бы трудно интегрировать это здесь. Вы должны либо пойти на forge (предоставляет RSA и все вокруг него), либо sjcl (обеспечивает шифрование ElGamal через KEM, которое должно быть реализовано вместе с AES-GCM; так что это тоже не очень просто).