Не знаете, что такое шифрование в браузере и дешифрование на сервере - PullRequest
0 голосов
/ 14 июля 2020

Вот кое-что, чего я не понимаю.

Я поиграл с некоторыми примерами кода о том, как зашифровать строку в браузере и расшифровать зашифрованный текст на server , и я не понимаю, насколько это безопасно.

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

Разве это не похоже на приклеивание ключей к сейфу?

Я должен отправить объект iv и key с полезной нагрузкой, вместе с зашифрованной строкой?

Мне что-то здесь не хватает.

async function generateKey() {

  return await window.crypto.subtle.generateKey({
            name:   "AES-CBC",
            length: 256
          },
          false,
          ["encrypt", "decrypt"]);

}

async function encryptString(data, key, iv) {

   return await window.crypto.subtle.encrypt(
          {
            name: "AES-CBC",
            iv,
          },
          key,
          data
        );

}

async function decryptString(data, key, iv) {

        const decrypted = await window.crypto.subtle.decrypt(
          {
            name: "AES-CBC",
            iv,
          },
          key,
          data
        );

        return new TextDecoder("utf-8").decode(new Uint8Array(decrypted));

}

async function example() {

     try {

       // Create the IV and Key
       const iv = window.crypto.getRandomValues(new Uint8Array(16));
       const key = await generateKey();

       // Convert the string I want to encrypt into an ArrayBuffer
       const data = new TextEncoder("utf-8").encode('Hello World!');
     
       // Encrypt the ArrayBuffer
       const ciphertext = await encryptString(data, key, iv);
       console.log(ciphertext);

       // Now I decrypt the obscured string using the same key and iv I used to encrypt it.
       const decrypted = await decryptString(ciphertext, key, iv);

       // Hello World!
       console.log(decrypted);

     } catch(error) {

       console.log(error);

     }

}

1 Ответ

0 голосов
/ 14 июля 2020

Фактически, ключ Symmetri c между браузером и сервером должен быть сначала установлен с использованием ключа Asymmetri c.

Подобно HTTS (TLS или SSL) - это зашифрованный канал с использованием ключа Asymmetri c (Publi c ключ в браузере и закрытый ключ на сервере).

Таким образом, вы можете полагаться на зашифрованный канал с использованием HTTPS (TLS) для защиты ваших ключей Symmetri c или, альтернативно, вы можете разработать свой собственный механизм для защиты он использует ключи Asymmetri c, для которых вам нужно будет сгенерировать пару ключей (общие для всех пользователей - на сервере или для каждого пользователя), publi sh publi c ключ для клиентов и клиентов будет использовать этот publi c ключ для шифрования ключа Symmetri c (и iv), который вы будете расшифровывать с помощью закрытого ключа на стороне сервера. После установки ключа Asymmetri c вы можете использовать его в течение фиксированного периода времени в соответствии с требованиями безопасности, а затем повторять процесс, скажем, через каждые 1 час, 6 часов или 24 часа и т. Д. c.

...