2016-01-21 229 views
4

我來關於閱讀會話管理的一些議題在PHP在此之後安全的討論,看看:辣椒還是不辣椒:從第 https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence#title.2散列密碼的加密?

報價?

一個更好的解決方案,這是如果你使用的硬件分離特別有用,是散列加密您在數據庫中,將其插入。有了這個保護措施,即使攻擊者找到了轉儲所有數據庫表的方法,他們首先必須解密哈希,然後才能開始破解它們。隨着PHP和數據庫在單獨的硬件上,這變得更加安全。

在這篇文章中,鏈接https://github.com/defuse/php-encryption共享...

到目前爲止,我只是爲了存儲密碼在數據庫中使用password_hash()。是否推薦加密哈希本身?你怎麼看?

感謝您的想法!

+1

我不確定,但不會更適合http://security.stackexchange.com/? – Pogrindis

+1

散列的安全性來自於猜測明文值需要很長時間的事實。加密的安全性來自於猜測密鑰需要很長時間的事實。在這兩種情況下,安全性都源於猜測所有可能的密鑰在計算上不可行。通過正確實施哈希,這應該已經足夠不可行了。更大幅度地增加賭注肯定不是壞事,但是否值得追加的複雜性取決於你。 – deceze

+0

你正在混淆加密和編碼在你的問題 - 這個問題是關於加密。 – 1615903

回答

5

使用適當的散列算法進行散列通常足以保護密碼,但之後加密(不編碼)散列確實更安全。

當您使用服務器端密鑰加密散​​列時,攻擊者必須獲得服務器上額外的權限才能獲得此密鑰(不含密鑰,散列值無效)。獲取只讀訪問數據庫比獲取服務器上的特權要容易得多。例如SQL注入,丟棄備份,丟棄服務器......在所有這些情況下,加密將保護哈希。

在此answer你可以找到更多的信息,或者你想看看我的tutorial有關安全存儲密碼的結束。

+0

簡潔而不張揚!很好的答案。 – Pogrindis

+0

我是他們引用文章的作者之一。我可能應該強調「這隻在數據庫處於單獨的裸機上時才提高安全性」。 –

+0

@ScottArciszewski - 通常Web服務器和數據庫服務器在不同的機器上,特別是共享主機。我在討論中知道「如果攻擊者可以在數據庫中進行制動,他可能會讀取文件系統」這個論點非常受歡迎,但那些確實是兩雙鞋子。接管服務器需要更多的知識和運氣,而不是欺騙應用程序以顯示太多信息。我很感謝你在文章中提到了服務器端密鑰的使用。 – martinstoeckli

2

是否建議對散列本身進行編碼?你怎麼看?

不,password_hash()/password_verify()就足夠了。需要脊柱龍頭級別安全性的人可以參考文章的這一部分,以避免accidentally shooting themselves in the foot trying to improve their security,但一般情況下,如果您在2016年使用bcrypt,那麼您很好

除非您的網站和數據庫有單獨的服務器,否則此策略的安全性增益爲零。如果我可以進入你的數據庫,我幾乎可以肯定地進入你的文件系統,並恢復加密密鑰。

如果您確實有單獨的硬件,並且您使用了經過驗證的加密庫(例如由Defuse Security提供的加密庫),請隨時使用它。只要知道它對大多數用例都沒有必要,因爲密碼散列API提供了相當好的安全性來抵禦現代密碼破解。

在PHP的更高版本中,他們也會支持Argon2。如果您打算過度使用,請切換到該模式,而不是增加協議的複雜性。

(另外,它是encrypt, not encode。)

0

根本不需要加密哈希值。攻擊者必須顛倒散列才能找到正確的明文(用戶密碼)。這相當於找出加密的正確密鑰。哈希就足夠了。加上明顯的鹽否則你的模式容易受到彩虹表攻擊

+0

「攻擊者必須將哈希反轉以找到正確的明文(用戶密碼)。」是的,如果他們甚至沒有散列工作,他們甚至不能開始使用他們的分佈式密碼破解集羣。 –

+0

仔細閱讀評論 –

+0

爲什麼?你真的想讓我去揭穿你的「這相當於找出正確的加密密鑰」的概念與數學? –