为 CryptoJS AES 加密密钥传递静态值是否安全?
Is it secure to pass static value for CryptoJS AES encryption key?
我想用 crypto js AES 加密来加密我所有的表单数据。像 below.Kindly 建议的那样在客户端保留加密密钥值好吗。
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
});
不,这通常不安全。
首先,你错误地陈述了你的目标。 AES 加密不是目的,它是达到目的的手段。您要做的是对表单数据保密。表单数据在加密术语中称为 "the message"。
如果您需要将消息发送到服务器,然后让服务器拥有解密的形式,那么您需要传输安全。最好为此使用 TLS。通常 JavaScript 没有任何方法可以与服务器建立信任关系(您的浏览器为此使用带有受信任证书的证书存储)。所以在那种情况下你不能依赖 JavaScript 安全性。
有时您想阻止前端解密消息。在这种情况下,您可以通过安全通道发送 public 密钥 ,例如 RSA public 密钥。然后您可以使用 RSA 和 AES(混合密码术)加密表单数据。然后您的后端将能够解密消息。如果您的前端发送了错误的密钥,此方案仍然会失败,因为消息将使用来自另一方的 public 密钥进行加密。所以这假设前端软件不能轻易被黑客攻击(或完全被不同的服务器替换,破坏流量)。
即使您可以使用受信任的 AES 密钥,然后使用 CBC 进行传输模式安全也肯定会启用明文或填充 oracle 攻击。您缺乏 way 太多的加密经验,无法实现这一目标。使用TLS,这已经够难了(为了安全,使用起来相对容易)。
我想用 crypto js AES 加密来加密我所有的表单数据。像 below.Kindly 建议的那样在客户端保留加密密钥值好吗。
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
});
不,这通常不安全。
首先,你错误地陈述了你的目标。 AES 加密不是目的,它是达到目的的手段。您要做的是对表单数据保密。表单数据在加密术语中称为 "the message"。
如果您需要将消息发送到服务器,然后让服务器拥有解密的形式,那么您需要传输安全。最好为此使用 TLS。通常 JavaScript 没有任何方法可以与服务器建立信任关系(您的浏览器为此使用带有受信任证书的证书存储)。所以在那种情况下你不能依赖 JavaScript 安全性。
有时您想阻止前端解密消息。在这种情况下,您可以通过安全通道发送 public 密钥 ,例如 RSA public 密钥。然后您可以使用 RSA 和 AES(混合密码术)加密表单数据。然后您的后端将能够解密消息。如果您的前端发送了错误的密钥,此方案仍然会失败,因为消息将使用来自另一方的 public 密钥进行加密。所以这假设前端软件不能轻易被黑客攻击(或完全被不同的服务器替换,破坏流量)。
即使您可以使用受信任的 AES 密钥,然后使用 CBC 进行传输模式安全也肯定会启用明文或填充 oracle 攻击。您缺乏 way 太多的加密经验,无法实现这一目标。使用TLS,这已经够难了(为了安全,使用起来相对容易)。