2017-09-15 42 views
1

我最初尝试在Bash中一个简单的加密脚本和它的工作如预期差不多。然而,我现在试图在Ruby中做同样的事情,Ruby版本的功能有点不同。OpenSSL的密钥长度在Ruby中太短,不击

猛砸

加密

echo 'hello' | openssl enc -aes-256-cbc -a 

密码:mypass

结果:U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=

解密

echo 'U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=' | openssl aes-256-cbc -d -a 

密码:mypass

结果:hello


红宝石

require "openssl" 
require 'base64' 

cipher = OpenSSL::Cipher.new('AES-256-CBC').encrypt 
cipher.key = 'mypass' 

这是我尝试在Ruby中是什么,到目前为止,但我收到OpenSSL::Cipher::CipherError: key length too short错误。我想尽可能地模仿Bash。

+1

关键是缩短,你选择使用一个256位(32字节)的密钥'-aes-256-cb',但只提供一个6字节的密钥'hello'。 Bash开发者只是懒于标记错误,但错误确实存在。 Ruby开发者更好,并标记错误。提供正确的长度密钥。 CBC还要求但不提供IV的问题,请查看文件以了解在每种情况下如何处理这些问题。此外,Bash和/或Rouy可能会将密码扩展为kay,并可能会创建一个随机IV并将其添加到加密数据中。 – zaph

+0

谢谢,这清除了很多东西。我对加密仍然很陌生,但对于这种特殊用例,我只想让一个难忘的密码成为关键。它是不是通过Bash版本将加密/解密加密到Ruby中? –

+0

一般的解决方案是使用密码派生函数(例如PBKDF2(Rfc2898))从密码创建密钥。正如Maarten指出OpenSSL默认使用PBKDF2,Ruby不会。但在任何情况下,安全性都是基于密码的“质量”,因此诸如PBKDF2之类的功能会减慢暴力攻击的速度。 – zaph

回答

3

OpenSSL使用一个称为EVP_BytesToKey的基于口令的密钥导出函数(PBKDF),使用8字节的盐和1的迭代计数。每个8位字节的魔术和盐都以密文为前缀(检查第一个结果的字节看魔术)。

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

另外,您将不得不为Ruby找到一个EVP_BytesToKey实现,但请注意,这是一个旧的OpenSSL特定函数,它具有完全不安全的迭代计数。

+0

谢谢。我将研究用于ruby实现的'EVP_BytesToKey'。就像我在@ zaph中提到的那样,我真的在寻找可以用一个密码保护的最佳加密方法。有没有比'EVP_BytesToKey'更好的解决方案来满足这个要求? –

+1

是的,OpenSSL中有PBKDF2包括Rubi API,但我不知道它是否可以从命令行获得。我认为这不是。 –

相关问题