vjs*_*p90 1 javascript encryption cryptojs
我想使用 cryptojs 对客户端和服务器之间传递的数据进行加密和解密。要解密数据,必须知道所使用的密钥,因此我有两个选择:
在这两种情况下,如果请愿书被捕获,您可以将其重新发送到服务器并访问该页面。
如果我使用固定密钥,如果您获得密钥,则可以解密所有消息,除非您更改密钥。
如果我将密钥与数据一起传递,您将获得密钥与数据(我以一种不明确的方式传递,因此您必须知道哪部分是密钥,哪部分是数据)。但这个关键随着每一次请愿而改变。
无论如何,我认为攻击者可以看到客户端代码并发现用于加密数据的过程并执行相反的过程。
最好的选择是什么?
PD:我知道 https 就是这样,但我也希望这样做。
选项1
假设您想使用 CryptoJS 并且想使用 HTTP,并且您不希望攻击者知道密钥,则可以使用PBKDF2。
PBKDF2是基于密码的密钥导出函数
您可以在浏览器上根据用户密码生成密钥,并使用它来加密数据加密密钥。
在服务器端,假设您可以从用户数据库访问用户密码,则可以使用该密码重新生成相同的 PBDKF2 密钥并解密数据加密密钥。
一旦服务器和客户端就共享数据加密密钥达成一致,他们就可以使用该密钥进行未来的数据交换。在此过程中,黑客可能无法访问数据加密密钥,因为它是以加密形式交换的。此外,它还要求人类输入黑客不知道其值的密码。
注意 1:如果您根据第三方身份验证提供商对用户进行身份验证并且您无权访问用户的密码,则此解决方案将不起作用。
注意 2: CryptoJS 似乎仅支持对称密码 - 因此,需要在客户端和服务器之间交换密钥。密钥必须通过共享秘密进行交换,该共享秘密不使用将使用密钥的同一通道进行共享。
选项:2
如果您由于某种原因无法使用 PBDKF2,并且仍然希望在客户端和服务器之间安全地交换密钥,那么您将不得不采用非对称加密。JSEncrypt库提供 RSA 加密。
如果使用该库,则客户端(浏览器)可以使用 CryptoJS 生成密钥,并使用 JSEncrypt 使用 RSA 公钥对其进行加密,并将加密后的密钥发送到服务器。服务器可以使用 RSA 私钥解密加密密钥。此过程将导致密钥的安全交换。
归档时间: |
|
查看次数: |
5595 次 |
最近记录: |