Javascript 为什么每次加载浏览器时CryptoJS都会产生不同的值

Javascript 为什么每次加载浏览器时CryptoJS都会产生不同的值,javascript,cryptojs,Javascript,Cryptojs,以下代码通过脚本标记在网页上运行。每次我加载页面或在浏览器控制台中运行代码时,我都会得到不同的值 var key = 'key-123:456'; var uid = 1234567890; var encrypted = CryptoJS.AES.encrypt(id, key); encrypted.toString(); 无论我在控制台中加载页面或运行代码多少次,如何为“单个id”设置单个“加密值” AES是一种“分组”密码,这意味着它对从明文到密文(反之亦然)的固定长度块进行确定性操作

以下代码通过脚本标记在网页上运行。每次我加载页面或在浏览器控制台中运行代码时,我都会得到不同的值

var key = 'key-123:456';
var uid = 1234567890;
var encrypted = CryptoJS.AES.encrypt(id, key);
encrypted.toString();
无论我在控制台中加载页面或运行代码多少次,如何为“单个id”设置单个“加密值”

AES是一种“分组”密码,这意味着它对从明文到密文(反之亦然)的固定长度块进行确定性操作。但是,通常(并且通常更倾向于)使用“”将不确定性添加到加密过程中。例如,CBC模式(CryptoJS默认使用)在加密前(以及相应地在解密后)将随机初始化向量与明文异或:

这是非常可取的,因为否则窃听者可以检测到重复的数据块,这可能使攻击者最终了解正在通信的内容——撤销加密的整个点

然而,听起来你希望你的加密有这个特定的弱点,这对我来说意味着也许你根本不想要加密。相反,您可能需要一个哈希,它是一个确定性的单向转换。()对于散列,给定的输入
a
将始终散列到相同的散列值
H
,因此您可以比较
hash(a)==hash(B)
,查看
a==B
。(这不是一个完美的比较,因为散列有无限的输入空间和有限的输出空间,但散列是特意设计的。)这就是网站安全存储密码的方式:服务存储
Hash(password)
而不是
password
本身,然后当用户提交密码条目时,这些站点比较
散列(条目)
散列(密码)
以查看条目是否正确

var hash = CryptoJS.SHA3(message);
但是,如果您确实需要将转换后的值反转回明文,而不仅仅是将其与另一个散列值进行比较,那么您确实需要加密。在这种情况下,您可以使用加密方式较差的ECB模式,该模式具有上述缺点。在CryptoJS中,您可以通过提供带有
模式
属性的选项对象来实现这一点:

CryptoJS.AES.encrypt(msg, key, { mode: CryptoJS.mode.ECB });
AES是一种“分组”密码,这意味着它对从明文到密文(反之亦然)的固定长度块进行确定性操作。但是,通常(并且通常更倾向于)使用“”将不确定性添加到加密过程中。例如,CBC模式(CryptoJS默认使用)在加密前(以及相应地在解密后)将随机初始化向量与明文异或:

这是非常可取的,因为否则窃听者可以检测到重复的数据块,这可能使攻击者最终了解正在通信的内容——撤销加密的整个点

然而,听起来你希望你的加密有这个特定的弱点,这对我来说意味着也许你根本不想要加密。相反,您可能需要一个哈希,它是一个确定性的单向转换。()对于散列,给定的输入
a
将始终散列到相同的散列值
H
,因此您可以比较
hash(a)==hash(B)
,查看
a==B
。(这不是一个完美的比较,因为散列有无限的输入空间和有限的输出空间,但散列是特意设计的。)这就是网站安全存储密码的方式:服务存储
Hash(password)
而不是
password
本身,然后当用户提交密码条目时,这些站点比较
散列(条目)
散列(密码)
以查看条目是否正确

var hash = CryptoJS.SHA3(message);
但是,如果您确实需要将转换后的值反转回明文,而不仅仅是将其与另一个散列值进行比较,那么您确实需要加密。在这种情况下,您可以使用加密方式较差的ECB模式,该模式具有上述缺点。在CryptoJS中,您可以通过提供带有
模式
属性的选项对象来实现这一点:

CryptoJS.AES.encrypt(msg, key, { mode: CryptoJS.mode.ECB });

这种加密可能会使用一种使值每次都不同的salt,以防止偷窃?不确定,只是个想法。(像php和加密)因为它使用了。如果您想要一个确定性转换,那么(1)这通常不是您想要的加密属性,(2)您想要ECB模式。为什么要进行确定性转换?请参阅CryptoJS自述文件的相关部分:我同意DevMoutarde。我需要匹配下游的数据,所以我需要有一个确定的值来解密。也许我没有正确使用CryptoJS。我现在将查找您的github文档。@wailer您是否需要将数据转换回原始格式?你能用散列来代替吗?这将允许您将数据转换为不可逆的形式,但允许以散列形式进行比较。这就是安全密码比较的工作原理:您不存储密码,而是存储
哈希(密码)
,当用户登录时,您将哈希与
哈希(条目)
进行比较。这是否适合您的需要,或者您需要在比较后的某个时间点解密数据?这种加密可能会使用一种使值每次都不同的salt,以防止窃取?不确定,只是个想法。(像php和加密)因为它使用了。如果您想要一个确定性转换,那么(1)这通常不是您想要的加密属性,(2)您想要ECB模式。为什么要进行确定性转换?请参阅CryptoJS自述文件的相关部分:我同意DevMoutarde。我需要匹配下游的数据,所以我需要有一个确定的值来解密。也许我没有正确使用CryptoJS。我会查你的g