首先,請注意,大多數人不會將加密爲(如您所寫)密碼到其數據庫中。加密,無論是對稱還是不對稱,都意味着數據可以被再次解碼。加密密碼將是一個非常糟糕的概念(至少如果所有密碼都有共同密鑰的話),因爲解密密鑰必須存儲在某個地方,如果攻擊者能夠得到它們,他可以立即解密所有密碼。
你想要做的就是所謂的哈希。通過將散列函數應用於密碼,密碼的散列來自密碼。這裏的關鍵是這個過程不能被恢復,即沒有數學方法從密碼中取回密碼。
說了:
MySQL的SET PASSWORD
和PASSWORD()
已被棄用。 They will be removed in future versions of MySQL.如果您希望您的應用程序能夠與未來版本的MySQL一起運行,請不要使用SET PASSWORD
和PASSWORD()
。
MD5和SHA1絕對不是要走的路;他們被認爲是壞的。
在數學意義上,SHA-2系列(例如SHA256,SHA512)被認爲是安全的。儘管如此,它的計算成本低,速度快,而今天的消費GPU可以計算出每秒數十億次的SHA-2哈希值。因此,對於散列的口令,其他散列函數等bcrypt
,pbkdf2
或scrypt
(這是我目前最喜歡的)是合適的;這些設計的速度很慢(如何調整速度,這是未來的一大優勢),以及(在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提供您使用的是緩慢的哈希算法。您可以在應用程序後端進行散列和數據庫散列之間切換,而無需重新計算所有存儲的散列,也不會丟失數據。
拇指的附加規則:
最後,here is a blog entry這應該讓你開始。這會讓你對重要的事情有一種感覺,但是你需要做進一步的研究(現在是四年後......)。
訪問後@Nikhil寶寶提供並閱讀password_hash()和password_verify() –