为什么每次浏览器加载时 CryptoJS 都会产生不同的值
Why CryptoJS produced different value every time the browser loads
以下代码是通过脚本标记在网页上 运行。每次我加载页面或 运行 浏览器控制台中的代码 - 我得到不同的值...
var key = 'key-123:456';
var uid = 1234567890;
var encrypted = CryptoJS.AES.encrypt(id, key);
encrypted.toString();
无论我加载页面或 运行 控制台中的代码多少次,我如何才能为 "single id" 设置一个 "encrypted value"?
AES 是一种 "block" 密码,这意味着它在从明文到密文(反之亦然)的固定长度块上确定性地运行。但是,通常(并且通常首选)使用“mode of operation”来为加密过程添加不确定性。例如,CBC 模式(CryptoJS 默认使用)在加密之前(以及相应地在解密之后)对随机初始化向量与明文进行异或运算:
这是非常可取的,因为否则窃听者可以检测到重复的块,这可能允许攻击者最终了解正在通信的内容 - 撤消整个加密点。
但是,听起来您 想要 您的加密有这个特定的弱点,这对我来说表明您可能根本不需要加密。相反,您可能需要一个 hash,这是一种确定性的单向转换。 (CryptoJS supports several hashes.) With a hash, a given input A
will always hash to the same hash value H
, so you can compare Hash(A) == Hash(B)
to see if A == B
. (This isn't a perfect comparison, since hashes have an infinite input space and finite output space, but hashes are deliberately designed so that it's very, very difficult to find two inputs that produce the same output。)这就是网站安全存储密码的方式:该服务存储 Hash(password)
而不是 password
本身,然后当用户提交密码条目时,网站会比较 Hash(entry)
和 Hash(password)
查看条目是否正确。
var hash = CryptoJS.SHA3(message);
但是,如果您确实需要将转换后的值反转回明文,而不仅仅是将其与另一个散列值进行比较,那么您确实需要加密。在这种情况下,您可以使用密码学上较差的 ECB 模式,它具有上述弱点。在 CryptoJS 中,您可以通过提供带有 mode
属性:
的选项对象来做到这一点
CryptoJS.AES.encrypt(msg, key, { mode: CryptoJS.mode.ECB });
以下代码是通过脚本标记在网页上 运行。每次我加载页面或 运行 浏览器控制台中的代码 - 我得到不同的值...
var key = 'key-123:456';
var uid = 1234567890;
var encrypted = CryptoJS.AES.encrypt(id, key);
encrypted.toString();
无论我加载页面或 运行 控制台中的代码多少次,我如何才能为 "single id" 设置一个 "encrypted value"?
AES 是一种 "block" 密码,这意味着它在从明文到密文(反之亦然)的固定长度块上确定性地运行。但是,通常(并且通常首选)使用“mode of operation”来为加密过程添加不确定性。例如,CBC 模式(CryptoJS 默认使用)在加密之前(以及相应地在解密之后)对随机初始化向量与明文进行异或运算:
这是非常可取的,因为否则窃听者可以检测到重复的块,这可能允许攻击者最终了解正在通信的内容 - 撤消整个加密点。
但是,听起来您 想要 您的加密有这个特定的弱点,这对我来说表明您可能根本不需要加密。相反,您可能需要一个 hash,这是一种确定性的单向转换。 (CryptoJS supports several hashes.) With a hash, a given input A
will always hash to the same hash value H
, so you can compare Hash(A) == Hash(B)
to see if A == B
. (This isn't a perfect comparison, since hashes have an infinite input space and finite output space, but hashes are deliberately designed so that it's very, very difficult to find two inputs that produce the same output。)这就是网站安全存储密码的方式:该服务存储 Hash(password)
而不是 password
本身,然后当用户提交密码条目时,网站会比较 Hash(entry)
和 Hash(password)
查看条目是否正确。
var hash = CryptoJS.SHA3(message);
但是,如果您确实需要将转换后的值反转回明文,而不仅仅是将其与另一个散列值进行比较,那么您确实需要加密。在这种情况下,您可以使用密码学上较差的 ECB 模式,它具有上述弱点。在 CryptoJS 中,您可以通过提供带有 mode
属性:
CryptoJS.AES.encrypt(msg, key, { mode: CryptoJS.mode.ECB });