使用cryptojs在客户端加密和解密数据

时间:2020-09-25 06:29:56

标签: javascript encryption cryptography cryptojs

我正在开发chrome扩展程序,以将一些用户数据保存到本地存储中。我用crypto-js编码数据。 但是,我面临一个小问题/难题-如果我使用密钥abc123对用户数据进行编码,则会得到类似的2FsdGVkX19v0LNG0FKFv1SxAQj4AqdNvWWMGyi9yVI=。但是,如果我使用另一个abc之类的密钥对其解密,则会得到空字符串。只有正确的密钥才能返回非空字符串。

所以我的问题是我该如何编码数据,如果使用错误的密钥解码仍会返回一些字符串?是否为此或其他编码进行了一些配置? 如果我是黑客,并且正在使用蛮力破解数据,那么看起来很明显,这是用户使用什么秘密密钥对数据进行编码。

Fidller来摆弄配置。

2 个答案:

答案 0 :(得分:0)

由于您使用的是Crypto.js,因此仅限于流行且经过考验的算法。假设您使用的是AES-256-CBC,其密钥来自密码(“ abc123”)。

如果您加密人类使用的东西,那么它可能具有较低的熵,因此具有某种结构。考虑一下您要加密的JSON字符串。如果攻击者尝试使用某个随机密钥解密密文,则他们可能会获得随机字节。如果他们知道必须取回JSON,那么他们就知道解密是否有效。他们使用不同的密钥再次尝试,并获得不同的随机字节。他们重复此过程,直到找到具有有效JSON结构的纯文本为止。即使他们不知道它是JSON,他们也可以利用统计方法来推断他们是否获得了正确的密钥。

您可能需要在加密之前使用gzip才能使这种推断更加困难,但是攻击者可能只是在他们的bruteforcer中加入ungzip程序,然后进行统计分析。

AES是一种分组密码,其中更改密钥中的单个位会以不变的纯文本形式将密文中的大约一半位更改。这意味着攻击者将无法看到他们正在接近正确的密钥。他们将不得不尝试所有这些。

使攻击者更难的通常方法是增加工作系数。默认情况下,Crypto.js使用EVP_bytestokey和密码的MD5哈希值的单个迭代来生成密钥。此操作相当快。您可以将其更改为具有一百万次迭代的PBKDF2之类的东西,但是当今的计算机是如此之快,以至于无法解决您的问题...

主要问题是您的密码太短。 “ abc123”是一个密码,使用Crypto.js默认值(1xMD5)时可以以毫秒为单位进行暴力破解,而使用具有一百万次迭代的PBKDF2则可以以分钟为单位。在密码中添加单个字符会使暴力破解工作量至少增加50(取决于类别:大写,小写,数字,特殊)。

现在,您可以计算密码的长度,以便干扰与您的风险偏好相对应的攻击者。

请注意,仅进行加密并不能解决您的所有问题。通常,威胁仍然是exists

答案 1 :(得分:-1)

您只能使用加密密钥解密数据。 我个人不会在前端应用程序中加密数据。

也许您应该看一下文档: https://cryptojs.gitbook.io/docs/

相关问题