【问题标题】:crypto-js output is different from node cryptocrypto-js 输出与节点加密不同
【发布时间】:2019-12-15 16:10:40
【问题描述】:

我们正在尝试匹配 crypto 和 crypto-js 输出。 我们的要求是在浏览器中加密字符串,但加密不支持浏览器端加密。因此,我们正在尝试使用 crypto-js 匹配输出。每次 crypto-js 产生不同的输出。

const crypto = require('crypto');
const CryptoJS = require('crypto-js');

const payload = {
    name: 'John Doe'
}

// Node Package
function encryptNode(text) {
    const cipher = crypto.createCipher('aes-256-cbc', 'devOps');
    return cipher.update(Buffer.from(JSON.stringify(text)), 'utf8', 'hex') + cipher.final('hex');
}
console.log(encryptNode(payload));


// Browser Package
function encryptBrowser(text) {
    const ciphertext = CryptoJS.AES.encrypt(JSON.stringify(text), 'devOps', { mode: CryptoJS.mode.CBC });
    return ciphertext.toString(CryptoJS.format.Hex);
}
console.log(encryptBrowser(payload));

输出:

加密(预期):dfe03c7e825e9943aa6ec61deb4a8a73fdba0016a13c59c628ce025f39d44c7c

crypto-js: 4e5453abe7bd53d67d88aa4f040356c649fe0101366d05ce4c7d625cfd052cdc

【问题讨论】:

  • 您为 Node 和 Browser 使用两个不同的库有什么特别的原因吗?你可以同时使用github.com/brix/crypto-js 吗?它会给出恒定的结果。

标签: javascript node.js encryption cryptography cryptojs


【解决方案1】:

crypto.createCipherCryptoJS.AES.encrypt 利用 OpenSSL 函数 EVP_BytesToKey 的功能,它需要密码、可选 8 字节盐、摘要和迭代计数,并生成来自这些数据的密钥和 IV。这两个函数都使用 MD5 摘要和迭代计数 1 作为固定参数。

crypto.createCipher 不使用盐,因此每次都会生成 same 密钥和 IV,从而生成相同的密文(假设相同的明文)。

相比之下,CryptoJS.AES.encrypt 每次都会生成一个随机盐(herehere),因此每次都会生成一个不同的密钥和 IV,从而产生不同的密文(即使是相同的明文)。对于解密(除了密码),salt 是必需的,它不是秘密的,可以与密文一起传递(例如,在CipherParams-object 中传递给CryptoJS.AES.decrypt)。

因此,发布的代码 sn-p 的行为符合预期:使用crypto.createCipher 创建的密文不会改变,使用CryptoJS.AES.encrypt 创建的密文每次都会改变。

EVP_BytesToKeyweak,出于安全原因不应使用(至少在使用 MD5 和迭代计数为 1 时)。这同样适用于crypto.createCipher(由于缺少盐而更是如此),无论如何都已弃用,以及使用EVP_BytesToKeyCryptoJS.AES.encrypt 的重载变体。这两个库都提供了额外的或重载的方法,可以直接将密钥和 IV 传递给这些方法(如果需要,可以使用安全过程预先从密码短语派生)。

【讨论】:

  • 你有什么推荐的?
  • @LumbusterTick - 正如答案中已经指出的那样,我不会使用内置(不安全)密钥派生,而是直接传递密钥。两个库都支持这一点(crypto 通过createCipheriv()CryptoJS 通过将密钥作为WordArray 传递)。如果要从密码中导出密钥,则必须事先使用可靠的密钥导出函数,例如PBKDF2,这两个库也都支持。
猜你喜欢
  • 1970-01-01
  • 2014-08-15
  • 2012-12-09
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 2014-08-14
  • 2019-07-19
  • 1970-01-01
相关资源
最近更新 更多