Linux OpenSSL和CryptoJS SHA256加密转换
我的问题是OpenSSL的较新版本与CryptoJS的默认设置不兼容 openssl enc用于基于密码的密钥派生的默认哈希 在1.1.0中更改为SHA256,而在较低版本中更改为MD5。 默认情况下,使用MD5作为其密钥派生。OpenSSL使用MD5,但现在在OpenSSL版本>=1.1.0中使用SHA256 因此,如果我将Linux OpenSSL和CryptoJS SHA256加密转换,linux,encryption,openssl,sha256,cryptojs,Linux,Encryption,Openssl,Sha256,Cryptojs,我的问题是OpenSSL的较新版本与CryptoJS的默认设置不兼容 openssl enc用于基于密码的密钥派生的默认哈希 在1.1.0中更改为SHA256,而在较低版本中更改为MD5。 默认情况下,使用MD5作为其密钥派生。OpenSSL使用MD5,但现在在OpenSSL版本>=1.1.0中使用SHA256 因此,如果我将-md md5传递给OpenSSL,CryptoJS是兼容的: echo "Hello World" | openssl enc -aes-256-cbc -md md5
-md md5
传递给OpenSSL,CryptoJS是兼容的:
echo "Hello World" | openssl enc -aes-256-cbc -md md5 -pass pass:"Secret Passphrase" -e -base64
输出:u2fsdgvkx19auffavaqqq89scaapbos6ofcyqpj7ikufk=
CryptoJS:
CryptoJS.AES.decrypt('U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);
CryptoJS.AES.decrypt('U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);
输出:“你好,世界”
但是现在如果我想使用SHA256而不是MD5(删除
-mdmd5
):
echo "Hello World" | openssl enc -aes-256-cbc -pass pass:"Secret Passphrase" -e -base64
输出:U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=
CryptoJS:
CryptoJS.AES.decrypt('U2FsdGVkX19aufvaqQQ89scaApBos6oFCyqPj7IKUFk=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);
CryptoJS.AES.decrypt('U2FsdGVkX1/5LLkFkTpawh1im4a/fCco5hS42cjn/fg=', 'Secret Passphrase').toString(CryptoJS.enc.Utf8);
输出:空
如何告诉CryptoJS使用SHA256而不是MD5进行密钥派生?CryptoJS“原样”似乎没有提供这种灵活性。这是因为MD5的使用是硬编码到用于从密码短语派生密钥的函数中的。你可以看到它正在发生:
KDF代表密钥派生函数,创建时不提供摘要。EvpKDF.create()
本身确实有可能产生不同类型的摘要,如您所见:
它还显示MD5是默认值
所有这些都意味着,如果您将第一行修改为以下内容,解密将起作用:
var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: C_algo.SHA256 }).compute(password, salt);
事实上,在本地安装的模块中编辑(作为测试)该文件cipher core.js
后,您的最后一行代码确实会生成所需的Hello World
我所看到的在不修改CryptoJS模块本身的情况下复制此代码的唯一方法是将模块中的整个代码块复制到您自己的代码中