2017-09-03 30 views
0

我一直在研究將我的密碼加密到mySQL數據庫中的最佳方式,但是我一直無法確定密碼的最佳加密方式。使用哪種方法來加密MySQl數據庫中的密碼?

  • md5()說的,因爲我不知道各種安全方面的原因是有缺陷的,但不知何故由WordPress使用。爲什麼這個功能如此受到批評?

  • sha1()只是靈感來自md-系列計算複雜度更高的另一個函數。

  • password()似乎被建議使用。

  • ,並在MySQL

  • 那麼PASSWORD(),新功能hash()開始施行的在PHP 5.1.2。而新版本

以何種方式是MYSQL PASSWORD()從上面提到的其他PHP函數有什麼不同?

+0

訪問後@Nikhil寶寶提供並閱讀password_hash()和password_verify() –

回答

1

首先,請注意,大多數人不會將加密爲(如您所寫)密碼到其數據庫中。加密,無論是對稱還是不對稱,都意味着數據可以被再次解碼。加密密碼將是一個非常糟糕的概念(至少如果所有密碼都有共同密鑰的話),因爲解密密鑰必須存儲在某個地方,如果攻擊者能夠得到它們,他可以立即解密所有密碼。

你想要做的就是所謂的哈希。通過將散列函數應用於密碼,密碼的散列來自密碼。這裏的關鍵是這個過程不能被恢復,即沒有數學方法從密碼中取回密碼。

說了:

  • MySQL的SET PASSWORDPASSWORD()已被棄用。 They will be removed in future versions of MySQL.如果您希望您的應用程序能夠與未來版本的MySQL一起運行,請不要使用SET PASSWORDPASSWORD()

  • MD5和SHA1絕對不是要走的路;他們被認爲是壞的。

  • 在數學意義上,SHA-2系列(例如SHA256,SHA512)被認爲是安全的。儘管如此,它的計算成本低,速度快,而今天的消費GPU可以計算出每秒數十億次的SHA-2哈希值。因此,對於散列的口令,其他散列函數等bcryptpbkdf2scrypt(這是我目前最喜歡的)是合適的;這些設計的速度很慢(如何調整速度,這是未來的一大優勢),以及(在scrypt的情況下)消耗大量內存,從而導致基於硬件(ASIC,FPGA)的攻擊更加困難。

我不知道PHP,但大多數語言都有一個函數調用crypt()encrypt()或使用潛在的O/S(在Linux中:的glibc)的crypt() API等等,所以你可以使用這個作爲一個起點,但前提是它已經提供了一種慢速哈希算法(大多情況並非如此)。

MySQL有一個叫做ENCRYPT()的函數,它也使用操作系統的crypt(),but it is deprecated as well。 MySQL也有SHA2() function,但如上所述,這可能是不夠的。不幸的是,MySQL的(據我所知)沒有提供BCRYPT()PBKDF2()SCRYPT()或任何其他知名緩慢的哈希函數。

由於您應該使用其中一種較慢的散列算法,並且既然操作系統的crypt()(在大多數情況下)兩個MySQL都不提供它們中的任何一個,所以您應該在後端應用程序中執行散列。正如上面所說的,我不知道PHP,但我敢肯定,有至少一個衆所周知的慢散列算法的實現(不依賴於底層操作系統的/ libc中的crypt())。

順便說一句,會出現關於哈希算法的各種實現之間的結果沒有差異。例如,如果您使用您最喜歡的編程語言將SHA512應用於字符串,則結果將與使用MySQL將SHA512應用於同一字符串的結果相同。其他散列算法也是如此,包括慢速算法。雖然可能有表現區別。

這基本上意味着,如果你現在要做的哈希在你的應用後端,您可以稍後在MySQL儘快做到這一點爲MySQL提供您使用的是緩慢的哈希算法。您可以在應用程序後端進行散列和數據庫散列之間切換,而無需重新計算所有存儲的散列,也不會丟失數據。

拇指的附加規則:

  • 想都別想實現自己的登錄/密碼系統的你有前要充分了解我給所有引用。

  • 如果您由於某種原因不得不使用其他任何散列算法不是一個緩慢的,總是每個密碼不同的鹽析使用,當然。雖然有些人宣稱這是無用的,但我不這麼認爲。它仍然會使攻擊變得更加困難(與沒有鹽的哈希相比)。但對快速散列算法就像從SHA-2家族的那些,鹽是否使用與否,攻擊仍然會非常容易和比對的慢哈希算法一個攻擊效率

最後,here is a blog entry這應該讓你開始。這會讓你對重要的事情有一種感覺,但是你需要做進一步的研究(現在是四年後......)。

+0

謝謝你的答案,正在尋找這個。 – Explosion

+0

一個很好的答案,但有點誤導。讀取你的答案看起來就像你推薦原始的SHA作爲散列密碼的方法,我認爲情況並非如此,因爲原始的SHA,不管是否被醃過,都不適合用於散列密碼。 –

+0

@LukePark也許我應該更清楚一點,實際上我推薦scrypt。這就是爲什麼我提到「較慢的散列函數」和「增加迭代次數」的原因。除此之外,如果由14個成員組成的當地花藝師俱樂部和以1美元/月的價格在共享環境中託管他們的網站確實需要用於密碼存儲的scrypt哈希處理可能是無休止的討論的主題(可能它們不能使用scrypt,即使它們是願意因爲他們的CMS不提供它)。 – Binarus

相關問題