我的问题是 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 https://unix.stackexchange.com/questions/344150/why-can-one-box-decrypt-a-file-with-openssl-but-another-one-cant/344586#344586
默认情况下,CryptoJS https://code.google.com/archive/p/crypto-js/使用 MD5 进行密钥派生。 OpenSSL 使用 MD5,但现在在 OpenSSL 版本 >=1.1.0 中,它使用 SHA256。
所以如果我通过了-md md5
CryptoJS 与 OpenSSL 兼容:
echo "Hello World" | openssl enc -aes-256-cbc -md md5 -pass pass:"Secret Passphrase" -e -base64
output: U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=
加密JS:
CryptoJS.AES.decrypt('U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);
output: "Hello World"
但现在如果我想使用 SHA256 而不是 MD5(删除-md md5
):
echo "Hello World" | openssl enc -aes-256-cbc -pass pass:"Secret Passphrase" -e -base64
output: U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=
加密JS:
CryptoJS.AES.decrypt('U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);
输出:空
我如何告诉 CryptoJS 使用 SHA256 而不是 MD5 来进行密钥派生?