Использует ли запрос XMLHTTP POST к адресу HTTPS какое-либо шифрование?

Если мы используем функцию HTTP-запроса javascript:

var request = new XMLHttpRequest();

на https-адрес, будет ли он использовать какой-либо тип шифрования или MITM сможет видеть все данные, которые мы отправляем?

Пример:

function createAuthToken(baseRestURL, callback) {
    var APIPath = "account/api/session";
    var CORSPath = "https://cors-anywhere.herokuapp.com/";
    var completeRestURL = CORSPath + baseRestURL + APIPath;
    console.log("REST API URL: " + completeRestURL);

    var method = "POST";
    var postData = "{\"tokenId\": \"" + document.getElementById('api_key').value + "\",\"secret\": \"" + document.getElementById('secret').value + "\",\"loginMode\": 1,\"applicationType\": 35}";
    var async = true;
    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        if (request.readyState == 4 && (request.status == 200 || request.status == 201)) {
            console.log("ONLOAD");
            var status = request.status; // HTTP response status, e.g., 200 for "200 OK"
            console.log(status);
            var response = JSON.parse(request.responseText);
            console.log(response.session_token);       
            return callback(response.session_token);

        }

    }
    request.open(method, completRestURL, async);
    request.setRequestHeader("Content-Type", "application/json");
    request.setRequestHeader("Accept", "application/json");
    request.send(postData);

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

Грубый пример:

введите здесь описание изображения

var CryptoJS = require("crypto-js");
var stackOverflowKey = "30 82 01 0a 02 82 01..."
var postData = "{\"tokenId\": \"" + document.getElementById('api_key').value + "\",\"secret\": \"" + document.getElementById('secret').value + "\",\"loginMode\": 1,\"applicationType\": 35}";
var encryptedPostData = cryptoJS.hmacSHA256(postData, stackOverflowKey)

//let's skip the callback and request headers as they are the same as above

var request = new XMLHttpRequest();
request.open();
request.send(encryptedPostData);

Я не изучал информатику и ничего не нашел в Интернете по этому поводу. Какие общепринятые способы сделать это?


person Jesse Reza Khorasanee    schedule 08.08.2018    source источник
comment
Да, любой запрос к ресурсу HTTPS (который современный браузер не отклоняет) вы можете рассчитывать на сквозное шифрование.   -  person CertainPerformance    schedule 08.08.2018


Ответы (1)


HTTP в XMLHttpRequest, как и часть XML, - это просто оставшаяся схема именования. Поскольку используемые запросы могут включать не только URL-адреса протокола http, но и получать больше, чем просто тело ответа XML.

Например, в первоначальных рабочих черновиках W3C объект XMLHttpRequest был представлен следующим образом:

https://www.w3.org/TR/2006/WD-XMLHttpRequest-20060927/#introduction

Имя объекта - XMLHttpRequest для совместимости с Интернетом, иначе это не имеет особого смысла. Он поддерживает транспортировку других форматов данных в дополнение к XML, некоторые реализации поддерживают другие протоколы, кроме HTTP (однако эта функция не рассматривается в данной спецификации), а API поддерживает отправку данные тоже.

Обратите внимание на «некоторые реализации», поскольку это рабочий проект еще в 2006 году, поэтому не все использовали одну и ту же реализацию.

Текущая спецификация whatwg для XMLHttpRequest говорит об имени:

https://xhr.spec.whatwg.org/#introduction

Имя XMLHttpRequest является историческим и не имеет отношения к его функциональности.

Итак, пока используемый браузер реализует XMLHttpRequest в соответствии со спецификациями, запрос / ответ будет обрабатываться, как обычно, браузером, то есть зашифрованным для https.

person Patrick Evans    schedule 08.08.2018
comment
Означает ли это, что весь процесс установки SSL-соединения с сервером выполняется моим браузером за меня, когда я делаю запрос POST, такой как в примере? - person Jesse Reza Khorasanee; 08.08.2018
comment
@JesseRezaKhorasanee Да, все это обрабатывается за вас, поскольку нет низкоуровневого api для доступа к этому тонкому управлению, то есть нет api для настройки подтверждения SSL, соединения и т. Д. - person Patrick Evans; 08.08.2018