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

Javascript 使用cryptojs在客户端加密和解密数据,javascript,encryption,cryptography,cryptojs,Javascript,Encryption,Cryptography,Cryptojs,我正在开发chrome扩展,以将一些用户数据保存到本地存储。我用计算机对数据进行编码。 然而,我面临着一个小问题/难题-如果我使用密钥对用户数据进行编码,我会得到这样的结果2FsdGVkX19v0LNG0FKFv1SxAQj4AqdNvWWMGyi9yVI=。但是,如果我使用另一个密钥(如abc)对其进行解密,则会得到空字符串。只有正确的密钥返回非空字符串 所以我的问题是,我需要如何对数据进行编码,如果用错误的键进行解码,它仍然会返回一些字符串?是否有此编码或不同编码的配置? 如果我是一名黑客,

我正在开发chrome扩展,以将一些用户数据保存到本地存储。我用计算机对数据进行编码。 然而,我面临着一个小问题/难题-如果我使用密钥对用户数据进行编码,我会得到这样的结果
2FsdGVkX19v0LNG0FKFv1SxAQj4AqdNvWWMGyi9yVI=
。但是,如果我使用另一个密钥(如
abc
)对其进行解密,则会得到空字符串。只有正确的密钥返回非空字符串

所以我的问题是,我需要如何对数据进行编码,如果用错误的键进行解码,它仍然会返回一些字符串?是否有此编码或不同编码的配置? 如果我是一名黑客,并且我正在使用暴力破解数据,那么很明显,用户正在使用什么密钥对数据进行编码


修改配置。

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

也许您应该看看文档:

因为您使用的是Crypto.js,所以您只能使用流行且经过战斗测试的算法。假设您使用的是AES-256-CBC,密钥来自密码(“abc123”)

如果你对人类使用的东西进行加密,那么它很可能具有低熵,因此具有某种结构。想想你正在加密的JSON字符串。如果攻击者试图用一些随机密钥解密密文,他们可能会得到随机字节。如果他们知道必须取回JSON,他们就会知道解密是否有效。它们使用不同的键重试,得到不同的随机字节。他们重复这个过程,直到找到一个具有有效JSON结构的明文。即使他们不知道这是JSON,他们也可能利用统计方法来推断他们是否得到了正确的密钥

您可能需要在加密之前使用gzip,以使推断更加困难,但攻击者可能只是在其BruteForce中加入一个解压缩过程,然后进行统计分析

AES是一种分组密码,其中更改密钥中的一个位会更改密文中大约一半的位,而明文为常数。这意味着攻击者将无法看到他们正在接近正确的密钥。他们必须全部尝试

使攻击者更难的通常方法是增加功系数。Crypto.js在默认情况下使用EVP_bytestokey并对密码的MD5哈希进行一次迭代,以生成密钥。这个操作相当快。您可以通过一百万次迭代将其更改为类似PBKDF2的内容,但今天的计算机速度如此之快,这并不能解决您的问题

主要问题是您的密码太短。“abc123”是一个密码,在使用Crypto.js默认值(1xMD5)时,可以在毫秒内强制执行,在使用PBKDF2进行一百万次迭代时,可以在分钟内强制执行。在密码中添加一个字符将使蛮力至少增加50(取决于类别:上限、下限、数字、特殊)

现在,您可以计算您的密码应该保留多长时间,以便干扰与您的风险偏好相对应的攻击者


请注意,仅仅使用加密并不能解决所有问题。通常情况下,威胁仍然存在。

您建议查看哪一部分?您可能正在使用AES-CBC和PKCS#7填充。这意味着大约16个随机键中至少有1个会产生随机垃圾,而不是什么都没有。这是由于填充字节有时会起作用。