【问题标题】:OpenSSL and CryptoJS SHA256 encryption conversionOpenSSL 和 CryptoJS SHA256 加密转换
【发布时间】:2018-12-11 14:14:06
【问题描述】:

我的问题是较新版本的 OpenSSL 与 CryptoJS 的默认设置不兼容。

openssl enc 用于基于密码的密钥派生的默认哈希 在 1.1.0 中更改为 SHA256,而在较低版本中更改为 MD5。 https://unix.stackexchange.com/questions/344150/why-can-one-box-decrypt-a-file-with-openssl-but-another-one-cant/344586#344586

默认情况下,CryptoJS 使用 MD5 进行密钥派生。 OpenSSL 使用 MD5,但现在在 OpenSSL 版本 >=1.1.0 中使用 SHA256。

所以如果我将-md md5 传递给 OpenSSL,CryptoJS 是兼容的:

echo "Hello World" | openssl enc -aes-256-cbc -md md5 -pass pass:"Secret Passphrase" -e -base64

输出:U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=

CryptoJS:

CryptoJS.AES.decrypt('U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);

输出:"Hello World"


但是现在如果我想使用 SHA256 而不是 MD5(删除 -md md5):

echo "Hello World" | openssl enc -aes-256-cbc -pass pass:"Secret Passphrase" -e -base64

输出:U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=

CryptoJS:

CryptoJS.AES.decrypt('U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);

输出:空

如何告诉 CryptoJS 使用 SHA256 而不是 MD5 进行密钥派生?

【问题讨论】:

    标签: linux encryption openssl sha256 cryptojs


    【解决方案1】:

    似乎 CryptoJS “按原样”不提供这种灵活性。这是因为 MD5 的使用被硬编码到用于从密码中派生密钥的函数中。你可以看到它正在发生here in OpenSSLKdf

    var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
    

    KDF代表Key Derivation Function,创建时不提供摘要。 EvpKDF.create() 本身确实有可能产生不同类型的摘要,正如您在 its configuration options 中看到的那样:

            cfg: Base.extend({
                keySize: 128/32,
                hasher: MD5,
                iterations: 1
            }),
    

    这也表明MD5是默认的。

    所有这一切都意味着,如果您将第一行修改为以下内容,解密将起作用:

    var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: C_algo.SHA256 }).compute(password, salt);
    

    事实上,在您本地安装的模块中编辑(作为测试)该文件 cipher-core.js 之后,您的最后一行代码确实会产生所需的 Hello World

    我认为在不修改 CryptoJS 模块本身的情况下重现这一点的唯一方法是将模块中的一整段代码复制到您自己的代码中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2015-04-24
      • 2017-05-04
      • 1970-01-01
      相关资源
      最近更新 更多