使用cryptojs的最佳选择是什么,将密钥存储在客户端和服务器端,或生成密钥并将其传递给另一端?

时间:2015-07-05 13:43:19

标签: javascript encryption cryptojs

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

  • 使用存储在两侧的固定密钥。
  • 随机生成密钥并将其传递给另一侧的数据。

在这两种情况下,如果抓取请愿书,您可以将其重新发送到服务器并访问该页面。

如果我使用固定密钥,如果您获得密钥,则可以解密所有邮件,除非您更改密钥。

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

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

什么是最好的选择?

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

1 个答案:

答案 0 :(得分:2)

选项:1

假设您要使用CryptoJS并且您想要使用HTTP,并且您不希望攻击者知道密钥,您可以使用PBKDF2

  

PBKDF2是基于密码的密钥派生函数

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

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

一旦服务器和客户端同意共享数据加密密钥,他们就可以使用该密钥进行未来的数据交换。在此过程中,黑客可能无法访问数据加密密钥,因为它是以加密形式交换的。此外,它需要人员输入黑客不知道的密码。

注1: 如果您针对第三方身份验证提供程序对用户进行身份验证,并且您无权访问用户,则此解决方案将无法运行密码

注意2: CryptoJS似乎只支持对称密码 - 因此,需要在客户端和服务器之间交换密钥。密钥必须通过共享密钥进行交换,该秘密不使用将使用密钥的相同信道共享。

选项:2

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

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