2013-07-01 100 views
5

我正在考慮在Rails應用中使用attr_encrypted gem來進行字段級加密。我如何生成一個加密密鑰用於這個寶石?如何生成與attr_encrypted一起使用的加密密鑰

更新:

Encryptor的文檔,這是attr_encrypted使用的底層加密,規定如下(根據使用說明|基本):

secret_key = Digest::SHA256.hexdigest('a secret key') 
encrypted_value = Encryptor.encrypt('some string to encrypt', :key => secret_key) 

我猜想,a secret key可以是任意隨機字符串,並且調用hexdigest將根據它計算適當的固定長度的字符串。這是推薦的方式嗎?

+0

我試着回答,但有一個問題:你想保護明文數據的人是誰(或者什麼樣的場景)? –

+0

數據庫中的某些字段需要在休息時加密,主要用於非現場備份(場外備份系統無法訪問加密密鑰)。 –

+0

在這種情況下,我猜想非現場系統可以訪問數據,但不能訪問配置或源代碼?我可能仍然會錯誤地配置存儲至少部分密鑰,並使用gem的能力來調用方法來獲取正確的密鑰,以此作爲提供該密鑰的方式。但是,如果源代碼的安全性與備份數據無關,每個字段的加密密鑰的硬編碼也是可行的。 –

回答

6

關鍵字只是一個字符串,任何字符串都會這樣做,您只是想讓它遠離不允許看到明文數據的人。您只需使用SecureRandom.base64即可生成密鑰。這會使得它幾乎無法通過蠻力來推測,只需你很少的努力。

這裏有趣的是密鑰管理。這個寶石的選擇似乎是:

  • 硬編碼到應用程序的關鍵。這防止了例如通過例如「意外」讀取敏感數據。一個DBA或者支持工程師,但是如果他們能夠訪問源代碼和數據庫,那麼任何知道該gem是如何工作的人都是不安全的。

  • 引用將決定密鑰的命名方法。這更有意思,但要小心:將密鑰放入數據庫並不能真正增加安全性。可以訪問數據庫和代碼的人可以做很多事情,就好像該值是硬編碼的一樣。

,可以稍微改善的事情,或者至少,通過讓應用程序從一個位置讀取的密鑰的至少一部分得到加密的數據分離的開發團隊,開發人員(或者只是廣大開發者)無法在生產中訪問。除此之外,更難的是,至少現在這個寶石,因爲應用程序需要運行時才能訪問加密/解密密鑰。

這是否足夠好取決於你爲什麼要首先加密數據。

+0

+1。謝謝,尼爾。在我的情況下,加密的主要目的是對數據庫備份中的其餘數據進行加密,這些數據庫備份將在場外和物理上與密鑰分開。密鑰也將與代碼保持分開:最有可能的是,它將通過僅設置爲生產服務器上的生產密鑰值的環境變量進行設置。密鑰不會嵌入到應用程序的源代碼中。 –

+0

生成的密鑰需要多長時間? –

+0

'SecureRandom.base64'的默認輸出應該是足夠的(〜22個不同的字符),除了我可能會選擇說20個字符外,因爲你可以承擔一些難以輸入的東西。讓它延長並不能真正提高IMO的安全性。 –