將登錄信息存儲到數據庫中的最佳方式是什麼?我知道存儲平面文本密碼根本沒有建議。其他方法有哪些? 如果使用密碼的哈希值,PHP中的哪些函數可用於存儲和驗證登錄信息?用於在數據庫中存儲登錄信息的方法
我在Windows機器上使用PHP,MySQL,Apache服務器。
將登錄信息存儲到數據庫中的最佳方式是什麼?我知道存儲平面文本密碼根本沒有建議。其他方法有哪些? 如果使用密碼的哈希值,PHP中的哪些函數可用於存儲和驗證登錄信息?用於在數據庫中存儲登錄信息的方法
我在Windows機器上使用PHP,MySQL,Apache服務器。
有此安全討論的兩個陣營:
密碼不要保存在你的數據庫。這通常意味着利用OAuth或同等功能。您需要存儲唯一標識用戶的「令牌」。此「令牌」由您選擇的身份驗證服務提供。該服務還提供身份驗證。
存儲密碼在數據庫中的散列(不可逆)轉換。然後,身份驗證過程將比較提供的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)
}
希望這有助於。
鮑勃
-1對不起,這是不好的建議,那不是鹽。你正在實施一個祕密密鑰,並且通過推薦一個公式,一旦他們看到源代碼,它就會被破壞,這是安全的。更糟糕的是,這很可能發生在攻擊者可以訪問哈希(這是安全地對它們進行哈希處理的整個點),並且很可能是您的服務器腳本。 – Josh
喬希 - 我認爲'鹽密碼'你拿了密碼,並增加了一些額外的位,使原來的猜字難以猜測。在上面的例子中,'saltThePword'函數是這個醃製完成的地方。哈希是在該函數之外完成的(sha1)。我沒有推薦一個公式,只是一個模式。哈希防止數據庫攻擊(SQL注入),其中一部分數據庫變爲公共。如果您的服務器以暴露您的數據和源代碼的方式受到攻擊,那麼遊戲幾乎就會丟失。 – rcravens
http://en.wikipedia.org/wiki/Salt_(cryptography) - 作爲好或更好的解釋我可以給你。如果您的服務器受到威脅,您至少可以放心,沒有已知的計算機可以解密密碼,因爲您已經使計算不可行。 – Josh
PHP給你md5()
,sha1()
,等等。一種典型的散列技術是爲你的明文密碼添加一個「鹽」,使其更難以暴力破解。
$pass = 'password';
$salt = 'aLongStringCalledASaltIsOftenUsedToMakeHashingMoreSecure';
$hash = sha1(md5($salt . $pass));
保存密碼,像串MD5( '密碼') 和當u會檢查用戶授權u使用查詢
$水庫=請求mysql_query(「SELECT ID,登錄名FROM用戶WHERE登錄='「。mysql_real_escape_string($ login)。」'AND password ='「。md5($ password)。」'「);
請不要推薦MD5。它壞了。 –
請不要推薦內聯查詢。當非常好的通用api可用時,我也會質疑數據庫特定接口的用法。 – Josh
開始通過閱讀:http://stackoverflow.com/questions/549/the-definitive-guide-to-website-authentication – sagi
我想指出的是,最下方的職位混淆鹽與填充。他們的服務宗旨完全不同......請不要犯同樣的錯誤。鹽總是在散列之外,並且用於使相同輸入的散列具有唯一性...參見http://en.wikipedia.org/wiki/Salt_(cryptography%29 – Josh
Josh - 您的參考狀態'鹽包含隨機位,創建單向函數的輸入之一'......換句話說,在鹽析過程之外存在散列。在鹽析之前散列密碼也是可以接受的,但是由於散列在理論上是不可逆的, – rcravens