ЯВАСКРИПТ

Сквозное шифрование в браузере

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

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

Это работает хорошо, если сервер не скомпрометирован. Злоумышленник будет иметь доступ к каждому журналу! Это то, чего мы хотели бы избежать.

Сквозное шифрование

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

Мы слишком много говорили Давайте программировать

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

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

const cryptoKey = await window.crypto.subtle.generateKey(
    { name: "AES-GCM", length: 128 },
    true,
    ["encrypt", "decrypt"]
  );

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

const encryptedData = await crypto.subtle.encrypt(
    { name: "AES-GCM", iv: new Uint8Array(13) },
    cryptoKey,
    new TextEncoder().encode(JSON.stringify(content))
  );

Теперь мы можем отправить зашифрованные данные на сервер. It is important to note that we do not provide the key to the server!

Сервер может вернуть нам идентификатор или URL. Это зависит от вас, ребята. В этом случае я предполагаю, что Сервер отправляет нам идентификатор.

const response = await (
  await fetch("/uploadToServer", {
    method: "POST",
    body: encryptedData,
  })
).json();
// {Id:'5f1fd529c049259da7dcc3b2'}

В этом случае нам нужен общий URL-адрес, чтобы делиться контентом с нашими друзьями.

const contentId = response.Id;
const contentKey = (await window.crypto.subtle.exportKey("jwk", cryptoKey)).k;
// this 'cryptoKey' object from up
const shareableUrl = '<http://localhost:3003/>' + contentId + "#sc=" + contentKey;
// Example: <http://localhost:3003/content?id=5f1fd529c049259da7dcc3b2#sc=rhX1rn9kKwak6nCeLVcHMQ>

С другой стороны воды 😛

Мы отправили ссылку, и наши друзья откроют ссылку. Давайте посмотрим на эту ситуацию.

Берем данные с сервера.

const response = await fetch(`/getFromId?id={id}`);
const encrypted = await response.arrayBuffer();

Нам нужен наш cryptoKey, он в URL.

const shareableKey = window.location.hash.slice("#sc=".length);
const key = await window.crypto.subtle.importKey(
  "jwk",
  {
    k: shareableKey,
    alg: "A128GCM",
    ext: true,
    key_ops: ["encrypt", "decrypt"],
    kty: "oct",
  },
  { name: "AES-GCM", length: 128 },
  false, 
  ["decrypt"],
);

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

const decryptedContent = await window.crypto.subtle.decrypt(
  { name: "AES-GCM", iv: new Uint8Array(13) },
  key,
  encrypted,
);
const decoded = new window.TextDecoder().decode(new Uint8Array(decryptedContent));
const content = JSON.parse(decoded);

Заключение

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

Следите за новостями!

›REF