2017-09-15 40 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,但我不知道它是否可以從命令行獲得。我認爲這不是。 –

相關問題