Вот кое-что, чего я не понимаю.
Я поиграл с некоторыми примерами кода о том, как зашифровать строку в браузере и расшифровать зашифрованный текст на 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);
}
}