Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux OpenSSL和CryptoJS SHA256加密转换_Linux_Encryption_Openssl_Sha256_Cryptojs - Fatal编程技术网

Linux OpenSSL和CryptoJS 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

我的问题是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 -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模块本身的情况下复制此代码的唯一方法是将模块中的整个代码块复制到您自己的代码中