2016-12-15 100 views
2

我們有一個非常標準的Symfony2應用程序。有一個提供者,一個密碼編碼器等等。密碼被散列,散列成本相當大。如何保護Symfony登錄免受計時攻擊?

換句話說 - 當有人試圖登錄時(不一定用正確的密碼) - 當有真正的用戶檢查散列以及不存在時,這是顯而易見的。在第二種情況下,它更快 - 沒有用戶 - 不需要散列等。

因此,如果在我們的應用中註冊了特定電子郵件,那麼很容易知道

Symfony中是否有內置的機制來防止這種泄漏?或者任何確定的最佳做法?

UPD響應第一答案: 如何處理一般這是或多或少清楚,問題是我們如何能做到這一點,而不Symfony的安全框架內的痛苦。

回答

0

使用PHP內置函數password_verify。從文檔:

驗證給定的哈希匹配給定的密碼。

請注意,password_hash()返回算法,成本和salt作爲返回散列的一部分。因此,所有需要驗證散列的信息都包含在其中。這允許驗證功能驗證散列,而不需要爲鹽或算法信息單獨存儲。

此功能對於定時攻擊是安全的。

如果使用symfony的密碼編碼器,它具有方法isPasswordValid,它在內部使用這個功能,所以您不必擔心計時攻擊:source code

+0

是的,我們使用這個功能。但是,如果有人輸入_not_existing_電子郵件 - 框架(我想)不會嘗試比較密碼,使頁面加載明顯的問題。所以很容易說出郵件是否存在於我們的數據庫中。那就是問題所在。 – user1312695

0

你需要考慮的是,如果用戶不存在,但你仍然想計算一個哈希以愚弄試圖枚舉用戶帳戶的攻擊者,將沒有密碼被哈希,所以你有兩個選擇(可以有更多,但現在我只想到關於這兩個):

1._有一個硬編碼的密碼,當用戶不存在時會被哈希。

2._使用僞隨機數生成器(PRNG)生成一個隨機密碼,這將是一個你會散列的密碼(我們並不真正在乎這些不可預測性,所以沒有必要使用密碼安全一)。

第一次嘗試的問題是,由於您總是哈希了相同的密碼,所以當用戶不存在時的響應時間將非常一致,因此即使攻擊者沒有看到明顯更快當用戶不存在時的響應,他可以注意到這些場景的平均響應時間。第二次嘗試有一個類似的問題,但在這裏,你散列一個隨機密碼並生成隨機密碼,所以你增加開銷並且響應很可能總是花費更長的時間,現有的用戶,所以攻擊者也可以注意到這種模式。

您可以做的是爲每個請求(現有和不存在的用戶)添加一個隨機噪聲,您將在其中添加幾毫秒的隨機延遲。通過這樣做,您可以爲不存在的用戶使用固定密碼,即使您將爲不存在的用戶計算相同的散列值,隨機噪聲也會使攻擊者難以知道它是真實還是虛假的登錄嘗試。

+0

其實,我認爲第一個選項沒有你提到的問題,因爲我們可以使用一些固定時間哈希函數,如另一個答案中建議的哈希函數。這是前進的方向,或者,正如我們在另一個項目中所做的那樣,我們只是分配固定時間用於授權過程,如果花費少於這個時間,則只是睡眠。這很好,但我的問題是如果我們在Symfony的安全框架中有任何優雅的/推薦的/內置的方式來做這件事。 – user1312695

相關問題