2011-07-15 123 views
0

將登錄信息存儲到數據庫中的最佳方式是什麼?我知道存儲平面文本密碼根本沒有建議。其他方法有哪些? 如果使用密碼的哈希值,PHP中的哪些函數可用於存儲和驗證登錄信息?用於在數據庫中存儲登錄信息的方法

我在Windows機器上使用PHP,MySQL,Apache服務器。

+2

開始通過閱讀:http://stackoverflow.com/questions/549/the-definitive-guide-to-website-authentication – sagi

+0

我想指出的是,最下方的職位混淆鹽與填充。他們的服務宗旨完全不同......請不要犯同樣的錯誤。鹽總是在散列之外,並且用於使相同輸入的散列具有唯一性...參見http://en.wikipedia.org/wiki/Salt_(cryptography%29 – Josh

+0

Josh - 您的參考狀態'鹽包含隨機位,創建單向函數的輸入之一'......換句話說,在鹽析過程之外存在散列。在鹽析之前散列密碼也是可以接受的,但是由於散列在理論上是不可逆的, – rcravens

回答

1

有此安全討論的兩個陣營:

  1. 密碼不要保存在你的數據庫。這通常意味着利用OAuth或同等功能。您需要存儲唯一標識用戶的「令牌」。此「令牌」由您選擇的身份驗證服務提供。該服務還提供身份驗證。

  2. 存儲密碼在數據庫中的散列(不可逆)轉換。然後,身份驗證過程將比較提供的pword的散列版本與數據庫中的散列版本。

根據您的安全考慮,應考慮複雜性。我認爲最小值應該是一個醃製的密碼實現。這通常是這樣的:

$hash = sha1(saltThePword($pword)); 

其中

function saltThePword($pword) 
{ 
    // combine the password with a salt. 
    // typically: 
    // $pword.$salt 
    // $salt can be static 
    // $salt can be unique to user (reproducible by a formula) 
} 

希望這有助於。

鮑勃

+0

-1對不起,這是不好的建議,那不是鹽。你正在實施一個祕密密鑰,並且通過推薦一個公式,一旦他們看到源代碼,它就會被破壞,這是安全的。更糟糕的是,這很可能發生在攻擊者可以訪問哈希(這是安全地對它們進行哈希處理的整個點),並且很可能是您的服務器腳本。 – Josh

+0

喬希 - 我認爲'鹽密碼'你拿了密碼,並增加了一些額外的位,使原來的猜字難以猜測。在上面的例子中,'saltThePword'函數是這個醃製完成的地方。哈希是在該函數之外完成的(sha1)。我沒有推薦一個公式,只是一個模式。哈希防止數據庫攻擊(SQL注入),其中一部分數據庫變爲公共。如果您的服務器以暴露您的數據和源代碼的方式受到攻擊,那麼遊戲幾乎就會丟失。 – rcravens

+0

http://en.wikipedia.org/wiki/Salt_(cryptography) - 作爲好或更好的解釋我可以給你。如果您的服務器受到威脅,您至少可以放心,沒有已知的計算機可以解密密碼,因爲您已經使計算不可行。 – Josh

1

PHP給你md5(),sha1(),等等。一種典型的散列技術是爲你的明文密碼添加一個「鹽」,使其更難以暴力破解。

$pass = 'password'; 
$salt = 'aLongStringCalledASaltIsOftenUsedToMakeHashingMoreSecure'; 
$hash = sha1(md5($salt . $pass)); 
+0

我不打算說在shad上運行md5是沒有意義的,但如果你擔心密碼安全問題,可以選擇更好的散列算法。 – JM4

+0

我同意;如果你想保證安全,你可以使用更好的散列,但是如果你真的關心了,你不會要求幫助StackOverflow – adlawson

+0

-1這不是鹽。 – Josh

0

保存密碼,像串MD5( '密碼') 和當u會檢查用戶授權u使用查詢

$水庫=請求mysql_query(「SELECT ID,登錄名FROM用戶WHERE登錄='「。mysql_real_escape_string($ login)。」'AND password ='「。md5($ password)。」'「);

+0

請不要推薦MD5。它壞了。 –

+0

請不要推薦內聯查詢。當非常好的通用api可用時,我也會質疑數據庫特定接口的用法。 – Josh

-1

我喜歡使用sha2作爲我的加密算法,還要確保你的鹽在安全的地方,而不是在名爲salt的列或表下的數據庫中。

+0

假設鹽每散列一次計算一次,並且應該是未加密的並且明顯。 – Josh