@novichkovv

Как передать секретную фразу из клиента js в сервер php?

Мне нужно безопасно передать из браузера на сервер секретную фразу (можно и наоборот, не имеет значения где фраза генерируется, важно ее сохранить и там, и там. Я смотрю в сторону ассиметричного шифрования, но никак не могу найти упорядоченную информацию по реализации. И насколько я понял, велосипед тут нельзя изобретать. В общем сформулирую задачу примерно так:
на js клиенте генерируется пара ключей, публичный ключ передается в первом сообщении серверу.
Сервер при помощи публичного ключа шифрует секретную строку и передает ее и публичный ключ в ответе на клиент.
Клиент расшифровывает секретную строку при помощи приватного ключа.
Не спрашивайте, зачем мне это, конечная задача намного шире, но в данный момент мне нужно именно это.
Я накидал при помощи JSEncrypt код, позволяющий шифровать строку по публичному ключу и расшифровать приватным ключом. Но непонятно, что делать на стороне сервера, как используя публичный ключ расшифровать строку и почему то же самое не сможет сделать человек, перехвативший сообщения.
Знаний почти нет по этому вопросу, в идеале, если вы подскажете библиотеки с готовой реализацией, ну или статью качественную
Вот код js
const keySize = 1024;
    let crypt = new JSEncrypt({default_key_size: keySize});
    let publicKey = crypt.getPublicKey()
    let privateKey = crypt.getPrivateKey();

    function encryptData(plaintext){ //Encrypts argument with Public Key
        let encrypt = new JSEncrypt();
        encrypt.setPublicKey(publicKey);
        return  encrypt.encrypt(plaintext);
    }
    let encryptedString = encryptData('some secret phrase');
    console.log(encryptedString);
    function decryptData(encryptedString){ //Decrypts argument with Private Key
        let encrypt = new JSEncrypt();
        encrypt.setPrivateKey(privateKey);
        return  encrypt.decrypt(encryptedString);
    }

    console.log(decryptData(encryptedString));
  • Вопрос задан
  • 224 просмотра
Решения вопроса 1
profesor08
@profesor08 Куратор тега PHP
Но непонятно, что делать на стороне сервера, как используя публичный ключ расшифровать

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

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

Если для сайта настроен SSL (https), то все эти манипуляции не нужны.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
djQuery
@djQuery
"Кодируем помаленьку" ("Сказка о Тройке")))
Как это делается в telegram:

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

В итоге: на пересылке ящик был всегда заперт, ключи всегда были при нас и никому не передавались.
Ответ написан
Комментировать
@romicohen
Системный Архитектор
...и почему то же самое не сможет сделать человек, перехвативший сообщения


насколько я понимаю, это ключевой вопрос во всем этом :)

Ну, по идее, SSL (https) для того и нужен, чтобы подобные сообщения не перехватывались.

Во-вторых, я бы на вашем месте посмотрел в сторону реализации OAuth2 - насколько я понимаю, этот протокол решает схожую с вашей, задачу. Есть много туторов по нему с картинками, это еще одно его преимущество :)

В-третьих, посмотрите в сторону ДВУХ пар ключей. Т.е. и на стороне клиента открытый-закрытый, и на сервере то же самое. Тоже есть описания данной схемы в инете (ну, просто много тут писать рисовать надо).

Надеюсь поможет :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы