NodeJS AES256 Encrypt不同于在线AES256加密工具



我使用 nodejs-aes256 加密了单词HelloWorldhttps://www.npmjs.com/package/nodejs-aes256,apple输出1ivBqj+nVPcHvZjQlx7Di0SoxV49bNpWtog=然后我使用在线工具使用相同的密钥加密相同的单词 http://aesencryption.net/输出LIxrc1buLeLLr9nJxtPhjHSYFVaceqsXiFamWiVWzYI=

乳清它们不同吗?

首先,"apple"不能是AES-256的键。这还不够长。AES-256 密钥必须正好为 256 位(32 字节)。"苹果",在可能的编码方式中,是5。所以这里已经有一个问题了。系统可能会为您填充零,但您不能依赖它。无论如何,这不是 AES 密钥应该的样子;它们需要是 32 个"有效随机"字节;"苹果"不是"有效随机的"。

nodejs 包表示它生成一个随机 IV。这可能意味着它还在输出中对随机 IV 进行编码,并期望它在输入中,果然这就是我们在代码中看到的:

ciphertext = Buffer.concat([iv, ciphertext, cipher.final()]);

假设 PHP 页面下方的源代码实际上与该工具相关,那么他们称之为:

$this->setIV("");

这可能在某个地方转换为 16 个字节的零(这是一个非常不安全的 IV)。

较短的答案是,应用AES或对输出进行编码绝对没有标准。您发现的绝大多数实现(包括这两个)都非常不安全,因为它们假设您知道如何添加它们缺少的所有部分。例如,这两种实现都需要 HMAC,因为它们使用 CBC 模式,但都不包含一个,如果要将"apple"等字符串作为密码,则需要像 PBKDF2 这样的密钥派生函数将其转换为密钥。(这就是你将像"apple"这样的字符串转换为"有效随机"的东西的方式。任何安全实现都将与任何其他安全实现不兼容。只是没有一种广泛使用的标准格式也是安全的。

综上所述,安全格式应始终导致两个加密具有不同的结果密文。nodejs 包通过包含随机 IV 来正确执行此操作,如果您多次运行它,您将获得不同的结果。这是一项防止某些类型攻击的功能。因此,拥有不同的结果应该不足为奇。

如果您正在寻找一种现成的AES格式,其中包括您需要的所有部分,请查看RNCryptor或libsodium。

最新更新