joken-前端工程师

  博客园 :: 首页 :: 新随笔 :: :: :: 管理 ::

window.crypto.subtle 支持AES-128对称加密算法。AES(高级加密标准)是一种广泛使用的对称加密算法,它有三种密钥长度:128位、192位和256位。在Web Crypto API中,你可以选择不同的密钥长度来生成AES密钥。

以下是一个使用AES-128-CBC模式的加密和解密示例:

async function generateKey() {
    return await window.crypto.subtle.generateKey(
        {
            name: "AES-CBC",
            length: 128, // 使用128位密钥
        },
        true, // 是否可导出
        ["encrypt", "decrypt"] // 使用密钥的操作
    );
}

function generateIV() {
    return window.crypto.getRandomValues(new Uint8Array(16)); // 128位IV
}

async function encryptData(key, data, iv) {
    const encodedData = new TextEncoder().encode(data);
    return await window.crypto.subtle.encrypt(
        {
            name: "AES-CBC",
            iv: iv,
        },
        key,
        encodedData
    );
}

async function decryptData(key, encryptedData, iv) {
    const decryptedData = await window.crypto.subtle.decrypt(
        {
            name: "AES-CBC",
            iv: iv,
        },
        key,
        encryptedData
    );
    return new TextDecoder().decode(decryptedData);
}

// 使用示例
(async () => {
    const key = await generateKey();
    const iv = generateIV();
    const data = "Hello, World!";
    const encryptedData = await encryptData(key, data, iv);
    const decryptedData = await decryptData(key, encryptedData, iv);
    console.log("Decrypted Data:", decryptedData);
})();

在这个示例中,generateKey 函数生成了一个128位的AES密钥。然后,encryptDatadecryptData 函数分别用于加密和解密数据。需要注意的是,AES-CBC模式需要使用一个初始化向量(IV),并且每个消息应该使用唯一的IV。

注意事项

  • IV 唯一性:对于AES-CBC模式,每个消息应该使用唯一的IV,以避免重放攻击。
  • 填充:AES是块加密算法,因此需要处理不足一个块大小的数据。AES-CBC模式通常使用PKCS7填充。
  • 性能:AES-CBC模式不支持并行处理,因此在处理大量数据时可能比AES-GCM模式慢。

通过window.crypto.subtle,你可以在前端应用中使用AES-128对称加密算法来保护数据的安全性。不过,通常情况下,前端加密操作应该与后端配合使用,确保整体系统的安全性。前端主要负责传输加密数据,而敏感数据的加密和解密操作最好在服务器端完成。

posted on 2024-12-05 22:08  joken1310  阅读(630)  评论(0)    收藏  举报