为CryptoJS AES加密密钥传递静态值是否安全?

时间:2019-05-09 11:36:39

标签: encryption base64 aes cryptojs

我想用crypto js AES加密对我的所有表单数据进行加密。最好将加密密钥值保留在客户端,如下所示。


var key = CryptoJS.enc.Utf8.parse("234234234DFDFDF343434DFDFDF")
      , iv = CryptoJS.enc.Utf8.parse("234234324234324")
      , data = CryptoJS.enc.Utf8.parse(str)
      , encryptedData = CryptoJS.AES.encrypt(data, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });

1 个答案:

答案 0 :(得分:0)

不,这通常是不安全的。

首先,您错误地陈述了自己的目标。 AES加密不是目标,而是达到目的的手段。您要做的就是对表单数据保密。表单数据在加密术语中称为“消息”。

如果您需要将邮件发送到服务器,然后让服务器拥有解密的表单,则需要传输安全性。最好为此使用TLS。通常,JavaScript没有任何方法可以与服务器建立信任关系(您的浏览器将其证书存储区与受信任的证书一起使用)。因此,在那种情况下,您不能依赖JavaScript安全性。

有时您想防止前端解密消息。在这种情况下,您可以通过安全通道发送公钥,例如RSA公钥。然后,您可以使用RSA和AES(混合加密)对表单数据进行加密。这样,您的后端就可以解密消息了。但是,如果您的前端发送了错误的密钥,该方案仍然会失败,因为该消息将使用来自另一方的公共密钥进行加密。因此,这假定前端软件不能轻易被黑客入侵(或完全由其他服务器替换,从而破坏了流量)。

即使您可以使用受信任的AES密钥,将CBC用于传输模式的安全性也肯定会启用纯文本或填充oracle攻击。您在加密方面缺乏 way 的丰富经验,无法做到这一点。使用TLS足够困难(要确保安全,使用它相对容易)。