2016-12-29 121 views

回答

4

首先,“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格式,请查看RNCryptorlibsodium