javascript - 使用 cryptojs 的最佳选择是什么,将 key 存储在客户端和服务器端,还是生成 key 并将其以某种方式传递给另一端?

标签 javascript encryption cryptojs

我想使用cryptojs对客户端和服务器之间传递的数据进行加密和解密。要解密数据,必须知道所使用的 key ,因此我有两个选择:

  • 使用存储在两侧的固定 key 。
  • 随机生成 key 并与数据一起传递给对方。

在这两种情况下,如果请求被捕获,您可以将其重新发送到服务器并访问页面。

如果我使用固定 key ,如果你得到了 key ,你就可以解密所有消息,除非你更改了 key 。

如果我将 key 与数据一起传递,您将得到 key 与数据(我以一种不明确的方式传递,因此您必须知道哪部分是 key ,哪部分是数据)。但这个关键随着每一次请愿而改变。

无论如何,我认为攻击者可以看到客户端代码并发现用于加密数据的过程并执行相反的过程。

最好的选择是什么?

PD:我知道 https 就是这样,但我也希望这样做。

最佳答案

选项:1

假设你想使用CryptoJS并且想使用HTTP,并且你不希望攻击者知道 key ,你可以使用PBKDF2 .

PBKDF2 is a password-based key derivation function

您可以在浏览器上根据用户密码生成 key ,并用它来加密数据加密 key 。

在服务器端,假设您可以从用户数据库访问用户密码,您可以使用该密码重新生成相同的 PBDKF2 key 并解密数据加密 key 。

一旦服务器和客户端就共享数据加密 key 达成一致,他们就可以使用该 key 进行 future 的数据交换。在此过程中,黑客可能无法访问数据加密 key ,因为它是以加密形式交换的。此外,它还要求人类输入黑客不知道其值的密码。

注 1:如果您根据第三方身份验证提供商对用户进行身份验证并且您无权访问用户的密码,则此解决方案将不起作用。

注 2: CryptoJS 似乎仅支持对称密码 - 因此,需要在客户端和服务器之间交换 key 。 key 必须通过共享 key 进行交换,该 key 不能使用与 key 使用相同的 channel 进行共享。

选项:2

如果您由于某种原因无法使用 PBDKF2,并且仍然希望在客户端和服务器之间安全地交换 key ,那么您将不得不采用非对称加密。图书馆JSEncrypt提供RSA加密。

如果使用该库,则客户端(浏览器)可以使用 CryptoJS 生成 key ,并使用 JSEncrypt 使用 RSA 公钥对其进行加密,并将加密后的 key 发送到服务器。服务器可以使用 RSA 私钥解密加密 key 。此过程将导致 key 的安全交换。

关于javascript - 使用 cryptojs 的最佳选择是什么,将 key 存储在客户端和服务器端,还是生成 key 并将其以某种方式传递给另一端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230994/

相关文章:

javascript - 想要在 amazon.de 上获取 span 的内容

javascript - 通过单击添加并拖动新项目

javascript - 为什么babel会把 "true"转成 "!0"

sql-server - 为 Azure SQL 池创建主 key 时出现问题 - 权限错误

Golang AES-CBC 256 使用 CryptoJS 解密

javascript - 返回数组和子节点

php - 正确使用 php openssl_encrypt 的方法

c - Blowfish 加密和解密字符缓冲区

javascript - 使用 crypto-js 加密密码并通过 ajax 发送表单(并在 java 中解密),我得到 : TypeError: Cannot read property 'words' of undefined

javascript - Node js通过公钥加密值错误TypeError : Data must be a buffer