Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
在Ruby中,而不是在Bash中,OpenSSL密钥长度太短_Ruby_Bash_Encryption - Fatal编程技术网

在Ruby中,而不是在Bash中,OpenSSL密钥长度太短

在Ruby中,而不是在Bash中,OpenSSL密钥长度太短,ruby,bash,encryption,Ruby,Bash,Encryption,我最初在Bash中尝试了一个简单的加密脚本,它的工作原理和预期的差不多。然而,我现在尝试在Ruby中做同样的事情,Ruby版本的功能似乎有点不同 猛击 加密 echo 'hello' | openssl enc -aes-256-cbc -a echo 'U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=' | openssl aes-256-cbc -d -a 密码:mypass 结果:U2FsdGVkX19rERfOXiKs97FgwIkLy3+tt

我最初在Bash中尝试了一个简单的加密脚本,它的工作原理和预期的差不多。然而,我现在尝试在Ruby中做同样的事情,Ruby版本的功能似乎有点不同

猛击 加密

echo 'hello' | openssl enc -aes-256-cbc -a
echo 'U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=' | openssl aes-256-cbc -d -a
密码:
mypass

结果:
U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=

解密

echo 'hello' | openssl enc -aes-256-cbc -a
echo 'U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=' | openssl aes-256-cbc -d -a
密码:
mypass

结果:
hello


红宝石 这是我到目前为止在Ruby中尝试过的,但我收到了一个
OpenSSL::Cipher::Cipherror:key length太短
错误。我希望尽可能地模仿Bash。

OpenSSL使用一个基于密码的密钥派生函数(PBKDF),名为
EVP_BytesToKey
,使用8字节的salt和1的迭代计数。密文的前缀分别是8字节的magic和salt(检查结果的第一个字节以查看magic)

显然,
“mypass”
不能是AES的正确密钥。AES密钥是128、192和256个密钥大小的16、24或32字节二进制值。但是,您可以直接使用命令行上的
-K
开关指定密钥,以使代码与Ruby
Cipher
对象兼容。在这种情况下,需要使用二进制(文件)或十六进制为
openssl
命令行和Ruby指定密钥。您还需要指定静脉注射


或者,您必须找到Ruby的
EVP_BytesToKey
实现,但请注意,这是一个旧的OpenSSL特定函数,迭代计数完全不安全

键很短,您已选择使用256位(32字节)键
-aes-256-cb
,但仅提供了6字节键
hello
。Bash开发人员只是懒得标记错误,但错误确实存在。Ruby开发人员做得更好,并标记了错误。提供正确的长度键。还有CBC要求但未提供的IV问题,请检查文件,了解在每种情况下如何处理。此外,Bash和/或ruby可能正在将密码扩展到kay,可能正在创建一个随机IV,并将其添加到加密数据中。谢谢,这将清除很多问题。我对加密还是个新手,但对于这个特殊的用例,我只希望有一个单一的、令人难忘的密码作为密钥。通过Bash版本将加密/解密导入Ruby是否不可取?一般的解决方案是使用密码派生函数(如PBKDF2(Rfc2898))从密码创建密钥。正如Maarten指出的那样,OpenSSL默认使用PBKDF2,Ruby则不使用。但在任何情况下,安全性都是基于密码的“质量”,PBKDF2等功能可以减缓暴力攻击。谢谢。我将研究ruby实现的
EVP\u BytesToKey
。就像我对@zaph提到的,我真的在寻找用一个密码就能保护的最好的加密。有没有比EVP_BytesToKey更好的解决方案可以满足这一要求?是的,OpenSSL中有PBKDF2,包括Rubi API,但我不知道它是否可以从命令行获得。我想不是。