在Ruby中,而不是在Bash中,OpenSSL密钥长度太短
我最初在Bash中尝试了一个简单的加密脚本,它的工作原理和预期的差不多。然而,我现在尝试在Ruby中做同样的事情,Ruby版本的功能似乎有点不同 猛击 加密在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
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
开关指定密钥,以使代码与RubyCipher
对象兼容。在这种情况下,需要使用二进制(文件)或十六进制为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,但我不知道它是否可以从命令行获得。我想不是。