2011-03-14 152 views
2

我對使用密碼做數據庫的最佳方式有些懷疑。我需要在密碼中進行加密,但是如果我使用MD5,我無法恢復密碼,不是嗎?數據庫加密 - php/mysql

和base64編碼器?它是安全的?使用這種加密技術,恢復並不是什麼問題。

對此提出建議?什麼是最好的方法? e更喜歡能夠記住舊通行證的解決方案,而不是定義新的密碼。

謝謝!

如果有人知道有關數據庫中的我真的很感激

+0

您需要一個雙向密碼,例如DES3,但是隨後您會介紹密鑰管理,彩虹表和salting等問題。簡單重置而不是恢復的單向散列更爲常見。密碼應該過期,如果用戶不記得它,現在是新的一個好時機。 – tawman 2011-03-14 19:23:32

+0

我刪除了加密標籤。這是關於消息摘要功能。同樣在未來,你應該搜索這樣一個通用的問題。 – rook 2011-03-15 00:11:22

回答

2

MD5不用於加密(這意味着它可以被解密)的安全密碼,而是用於消息消化/散列一個很好的教程。 Base64也不是加密,而是編碼,可以毫不費力地解碼。

如果數據庫中的加密密碼可以很容易解密,那麼在加密密碼存儲方面通常沒什麼意義。

安全的方法是隻存儲散列並將提交的密碼與存儲的散列進行比較,然後將它們在運行中散列。

你應該做的線沿線的東西:

$salt = 'some2%string!!here1'; 
$hash = sha1($salt . $_POST['password']); 

創建密碼的哈希值。您將該散列存儲在數據庫中。當用戶想要登錄時,您可以使用他提交的函數,使用相同的進程對其進行哈希處理,然後與數據庫中的哈希進行比較。如果它們匹配,則密碼是正確的。

+0

你知道任何教程來學習你的建議嗎?比較散列 – 2011-03-14 19:27:46

+0

已更新我的答案以顯示示例 – 2011-03-14 19:33:38

+1

要獲得額外的安全性,請爲每個用戶隨機生成'$ salt'。 – drudge 2011-03-14 19:46:25

4

如果我使用MD5我無法恢復通過, 是不是?

事實上,如果你使用hash MD5或SHA-1 您的密碼(加入salt是一個好主意,順便說一句),你將無法恢復密碼; 這就是這樣做的目標!

的想法是,如果有人能看看你的數據庫(可能是一些邪惡的實幹家,或者你的員工之一 - 誰可以是一個惡人),他將不能夠找到任何有用的密碼。


什麼是最好的方法是什麼? e更喜歡一個允許 記住舊通行證的解決方案,而不是定義 一個新的密碼。

最好的方法是做與你想要的相反的東西:不允許一個人得到他的舊密碼 - 並開發一些生成新密碼的方法。

這樣,你將確保沒有人能夠得到你的登錄和相應的密碼轉儲;這將使您的服務更加安全,以便您的用戶(特別是考慮到許多人使用幾個網站的相同登錄名/密碼對)

+0

迂腐筆記:您將無法直接翻轉密碼。然而,你可以使用彩虹表(谷歌甚至像一個工作)找到解決方案'x = md5(pass)'。所以雖然理論上它不可逆,但實際上它是... – ircmaxell 2011-03-14 20:20:32

+0

因此有關使用鹽的括號;-) – 2011-03-14 20:31:03

+0

我知道,但我認爲值得明確指出...... – ircmaxell 2011-03-14 20:36:45

0

base64不是「加密」。它旨在將二進制數據轉換爲可通過可能「破損」的電子郵件系統進行傳輸的安全格式,該系統無法正確處理8位二進制數據。這是穀物盒解碼器環的最佳選擇。

如果您想要加密,可以使用AES,DES和其他各種功能。問題是,如果你的代碼可以解密密碼,那麼攻擊者就可以知道你是如何做到的,並且/或者顛覆你的代碼爲他們做這件事是微不足道的。

密碼永遠不能以可以檢索純文本的格式進行存儲。如果用戶忘記了他們的密碼,就會清除舊密碼,生成一個新的臨時密碼,並強制他們在首次登錄時將此臨時密碼更改爲其他密碼。

0

您不應該永遠不需要記住用戶的密碼 - 這樣做是違反了他們的信任並提出了安全漏洞。

通常你會使用MD5散列密碼(現在最好使用SHA-2),並且當用戶提交他們的密碼以嘗試登錄時,也要散列該密碼,並查看散列是否爲比賽。

爲了增加安全性,您可以爲數據庫創建一個「salt」列,並在首次提交密碼時生成一個隨機salt。將鹽添加到密碼的開頭,然後對其進行散列。將salt +密碼的哈希和salt一起存儲。現在,當用戶提交他的密碼登錄時,您可以將它與salt結合,對其進行散列,並檢查散列是否匹配。

鹽可以確保如果多個用戶擁有相同的密碼(他們可能會這樣做),他們的密碼哈希將不會相同。

如果用戶忘記密碼,他們將不得不提供一個新密碼,只需存儲他們的密碼並在忘記密碼時將其發回給他們是不好的做法並且向用戶表明您不處理他們的隱私好。

0

如前所述,保存密碼時使用散列而不是加密。我通常不會使用隨機鹽,因爲這意味着數據庫中有一個額外的字段,以便您可以對用戶進行身份驗證。最簡單的解決方案是將密碼用作鹽,如下所示。易於使用且易於驗證。

$salt = $_POST['password']; 
$hash = sha1($salt . $_POST['password']); 
1

首先,有一個Significant Difference Between Hashing and Encryption。我建議你在繼續閱讀之前給予閱讀...

現在,至於你確切的問題,有幾種方法可以解決它。

  1. 使用強密碼加密您的密碼,以便在必要時加密您的密碼。解決方案such as the one in this post可能適用於此。但是請注意,這不是一個好主意,因爲如果你的系統受到威脅,所有的密碼都會被泄露(從來不是一個好主意)。有很少使用情況下才有意義來存儲它們加密,但如果你絕對必須,請使用強密碼加密日常使用強做...

  2. 存儲你的密碼單向散列法。不,md5($password)不夠好。但都不是sha1($salt . $password)。第一個是trivial to lookup most passwords,第二個可以通過簡單的試驗和錯誤在合理的時間內暴力破解。相反,stretch your passwords iteratively。最好的方法是使用標準的PBKDF2函數從密碼生成強大的單向密鑰。

    至於如何恢復用戶忘記密碼,請不要擔心。如果用戶忘記密碼,請創建一個新密碼並將其提供給用戶。這是處理被遺忘密碼的行業標準方式(Heck,Windows和Mac都是這樣做的)。你可能會認爲你是通過發送給他們來幫助你的用戶,但是你所做的只是關閉任何使用你的應用程序而對安全性有任何線索的人(並且使得人們瘋狂你會受到影響)。

0

立即停止並閱讀this。然後去找一個開源的庫來做用戶認證。我不是一個PHP開發人員,所以我不能向你推薦一個,但我確定它們存在。他們會遇到已經發現的安全漏洞。

此外,對於密碼,您應該查看bcrypt或類似的密碼散列函數,而不是使用像MD5或SHA這樣的快速散列算法。