2014-12-03 155 views
1

我有一個複雜的要求來加密出現在laravel配置中的所有密鑰(pwds)。沒有祕密信息可以存儲在明文! 可變參數需要在運行時拉入並解密。我希望他們通過Config類,即Config :: get()。在laravel中爲加密密鑰動態設置配置變量

沒有人有任何想法如何實現這一目標?

+0

而這樣做的原因是什麼? – 2014-12-03 02:24:36

+0

客戶有時會有要求。 – 2015-03-24 17:23:48

回答

1

好吧,我想出了一個解決方案,但如果任何人有更好的東西會很有意思。 我的方法是:

1)在服務器上生成一個密鑰,並以明文存儲爲一個全局變量。由於我使用的Apache我這樣做在我的Apache配置:

SetEnv APPLICATION_KEY "a-randonly-generated-32-char-key" 

該密鑰將用來加密/解密所有敏感的PWD /我們使用的密鑰。

2)寫入一個工匠命令來加密敏感值,並把它們存儲在配置。 Laravel不允許你輕鬆地做到這一點,所以我使用第三方包(https://github.com/Phil-F/Setting)來做到這一點。該軟件包允許您將配置變量寫入json。然後可以在運行時由應用程序檢索它們。

的人員命令接受鍵「名稱」和「值」作爲參數並調用:

$encryptedValue = Crypt::encrypt($value); 

然後存儲在JSON配置的值(使用呼叫到封裝類「設置」):

Setting::set($name, $encryptedValue); 

3)我們可以刪除敏感的配置變量。例如,如果我有一個配置變量通常檢索使用Config :: get('mail.password')然後我從mail.php配置文件中刪除此,我打電話給工匠通過'mail.password'和'密碼-值'。默認情況下,包將json存儲在/app/storage/meta/setting.json中。你應該在這裏看到你的加密變量。

4)現在我們需要在拉這些變量並在運行時對其進行解密。爲此,我將代碼添加到'before'過濾器中(請參閱/app/filters.php)。在這裏,我將祕密變量與通常的(靜態)laravel變量同步。爲整潔i中的加密的密鑰的名稱存儲爲/config/app.php陣列,例如

'encrypted_keys' => array('mail.password', 'services.mandrill.secret'), 

然後進行同步:

$encryptedKeys = Config::get('app.encrypted_keys'); 
foreach ($encryptedKeys as $encryptedKey) { 
    // Get encrypted key from json and decrypt it 
    $encryptedValue = Crypt::decrypt(Setting::get($encryptedKey)); 

    // Store it in the config (note: its not visible in the config file itself) 
    Config::set($encryptedKey, $encryptedValue); 
} 

該同步使得我們已經敏感數據使用Config :: get()可用,並使其與現有代碼更加兼容。另外,你必須在任何你想使用這些變量的地方去替換Config :: get()和Setting :: get()。

希望這可以幫助別人......我花了一段時間來解決全部問題!

+0

這對我有用,謝謝!我會注意到,存儲在apache中的密鑰並不適合我 - 當你運行命令行時,密鑰不可用,所以現在我要使用Laravel生成的密鑰,Crypt facade使用自動。 – 2015-03-31 20:31:06