2011-04-01 161 views
2

你使用什麼?使用它有什麼好處?存儲mysql密碼的最佳方法?

給我所有的技巧,優點和缺點的所有教程沒有告訴你的內幕。

+0

存儲密碼一個MySQL數據庫或在MySQL中存儲密碼... – deceze 2011-04-01 02:00:50

+0

您的意思是在MySQL中存儲密碼,或者存儲您的程序中需要訪問數據庫的MySQL密碼? – Sergey 2011-04-01 02:01:05

+0

在存儲用戶密碼的表中 – PHP 2011-04-01 02:05:14

回答

8

簡短的回答是:你不要。你實際存儲的是通過單向散列函數運行用戶密碼的結果。之前我會想到使用像MD5這樣的東西會沒事的,直到我看到this,並建議看看bcrypt,因爲它可以幫助抵禦暴力攻擊。

+0

許多致力於bcrypt upvotes在這裏。散列用戶密碼以對存儲的密碼進行測試的情況相對較少,因此使用.1s來執行該操作應該不成問題。但是,嘗試在相同的10/s下對哈希進行強力攻擊,並且永遠不會完成。隨着硬件標準的提出,Bcrypt也可以進行調整,以便進行更多的工作,從而使其兼容。 – 2011-04-01 13:05:12

+0

是的,是什麼促使我bcrypt讀到一個網站被黑客入侵,他們的用戶數據庫被下載。在這種情況下,如果您使用快速哈希,那麼可以避免攻擊者通過密碼強制攻擊。 – 2011-04-01 16:30:25

+0

@JosephMastey我很懷疑。如果你用.1s來測試密碼,你的服務器是不是很容易被DDoS攻擊? – 2013-01-19 18:07:52

-1

存儲密碼的簡單但安全的方法是使用MD5加密。

md5($password); 

將給出md5加密值。

+1

有人快速告訴我這個散列代表什麼:'18126e7bd3f84b3f3e4df094def5b7de'並證明爲什麼鹽是必須的。 – 2011-04-01 02:13:35

+3

這是mike哈哈鹽是必須的! – PHP 2011-04-01 02:15:33

+0

僅使用密碼使用MD5是不安全的。它可以使用[彩虹表](http://en.wikipedia.org/wiki/Rainbow_table)進行攻擊(一個表包含MD5散列,用於查找應用於MD5函數的原始值的可能值)。 備註:MD5不是加密函數,而是哈希函數 – VCD 2013-07-23 04:09:11

-1

您可以使用兩種或多種加密算法的組合。 例如:

md5(sha1($password)); 

或只是這樣的:

md5(md5($password)); 
+0

好處是加強加密 – Nabeel 2011-04-01 02:14:24

+1

md5不加密,也不是加密,也不是sha1 – 2011-04-01 02:14:47

+0

好吧,這是一個計算。而且因爲它改變了條目的方式,不應該讓它回到原來的位置;它將是encrypton – Nabeel 2011-04-01 02:18:03

0

你要存儲原始密碼,這樣

md5($password) 

登錄腳本schould是這樣的:

$sql = "SELECT `id` WHERE username=`$username` AND password=`" . md5($password) . "`"; 
$result = mysql_query($sql,$link); 
if (mysql_num_rows($result) == 1) { 
    // user is authenticated 
} 

這實際上應該更加複雜,但對於概念化來說,它已經被簡化了。

+0

單獨使用密碼使用MD5是不安全的。它可以使用[彩虹表](http://en.wikipedia.org/wiki/Rainbow_table)進行攻擊(一個表包含MD5散列,用於查找應用於MD5函數的原始值的可能值)。 – VCD 2013-07-23 04:11:53

+0

本示例不包含醃製密碼或高級哈希方法。它只是一個簡單的用戶查找,無需返回任何用戶名和密碼。 – 2013-07-23 13:34:36

+1

我對這個答案的理解是,它鼓勵人們用MD5散列密碼並將其存儲在數據庫中,這已知是不安全的。如果這個例子只是簡單地做一個用戶查詢,那麼這個答案與詢問如何存儲密碼的問題無關。此外,我不認爲簡單的用戶查找應該使用密碼作爲過濾條件。 – VCD 2013-07-24 02:25:11

1

散列在存儲密碼中很常見。但它們都是一樣的,只是它產生的哈希結果越長,被黑客攻擊的難度就越大。來自相同散列函數的散列結果通常具有相同的長度。對輸入文本(長度無限制)沒有限制,可以從多個句子/單詞中產生1個相同的散列字符串。這是洞所在的地方。閱讀更多關於pigeonhole principleBirthday Attack

我通常使用MD5()。但它已經超出了我猜測的標準,因爲一些碰撞事情。不知何故,人們發明了一種可以檢測1個散列字符串的系統,其中多個實際字符串爲 。

使用SHA代替。爲了使它更安全,你可以在它上面添加$ salt,使它成爲雙重保護,所以,首先對實際密碼進行哈希,將哈希值加入哈希密碼,然後再次哈希它們。

請記住,結果字符串越長越好。

一些推薦bcrypt,但我從來沒有使用過它。

+0

謝謝我從來不知道鴿子的原理。 – PHP 2011-04-01 02:24:34

-1

爲了讓事情變得簡單,使用帶有鹽的md5。 MD5是單向散列。例如:

md5("hello") = "5d41402abc4b2a76b9719d911017c592" 

所以,沒有鹽,你挽救了「5d41402abc4b2a76b9719d911017c592」到你的數據庫。然後,當您嘗試通過輸入密碼進行登錄時,您會將輸入密碼的md5與您保存的md5進行比較。

if (md5($input_password) == "5d41402abc4b2a76b9719d911017c592") 
    log_in_user(); 

但是,md5是不安全的,因爲x的md5總是y。因此,如果您要破壞數據庫並找到列爲「y」的密碼,那麼如果您創建或下載了md5查找表,則知道該密碼爲「x」。

而是做這樣的事情:

$password_to_save_to_db = md5(md5($input_password . $date_user_registered)); 

因此,每個用戶都會有自己獨特的鹽和這些查詢表將變得毫無用處。 (這可能是黑客想偷每個密碼重新創建,但這是耗費更多的時間和加上雙MD5使事情變得有點困難。

你可以閱讀更多的http://sameerparwani.com/posts/using-salts-for-extra-security