2009-06-21 28 views
2

所以我一直在閱讀很多關於PHP加密的知識。非常多,我不確定安全存儲登錄信息的真正好方法是什麼。我的驗證加密是否有用?

但是,下面的功能是什麼,我想出了:

function loginHash($username, $password){ 
    $salt = str_split($password,(strlen($password)/2)+1); 
    $hash = hash('whirlpool', $username.$salt[0].'centerSalt'.$salt[1]); 
    return $hash; 
} 

我在做正確的方式?它用於驗證與用戶名相結合的密碼,以及將生成的哈希與存儲在數據庫中的哈希進行比較以驗證登錄的功能。

回答

6

加密!=哈希。它們通常都被認爲屬於密碼學的範疇,但是當某些東西可以被加密時,它可以被解密,而哈希則不是這種情況。散列只是散列,就是這樣。

鹽確實沒有正確構建。它應該是使用fopen()調用從/ dev/urandom讀取的x字節。例如,16字節的鹽是我個人使用的。這可以有效防止彩虹表攻擊。

爲了使事情更安全,也請使用密鑰。例如:

$hashedPassword = hash_hmac('whirlpool',$password.$salt,$key); 

$ key只是隨機數據。例如,您可以生成一個64 kB文件,該文件在文檔根目錄之上的隱藏文件夾中稱爲「key.bin」,並在哈希處理之前使用file_get_contents()。

爲什麼要使用密鑰?如果你將哈希和salt存儲在一個數據庫和文件系統中的密鑰中,那麼這將防止任何人破解你的哈希,如果他們把手放在你存儲的哈希和鹽上。所以,攻擊者需要破解數據庫和文件系統來破解你的哈希,但是要注意,如果任何人已經破解了你的整個應用程序,那麼破解你的哈希值就毫無意義,這意味着你的哈希方案是好的。

6

我的建議是永遠不要寫永遠不寫你自己的加密和散列函數。即使專家一直在做錯,所以不要自己嘗試。

我聽說phpass (Openwall)是一個很好的哈希框架,我建議你使用它。

他們在他們的哈希中使用鹽,並有相當一些參數來調整散列。

+0

謝謝。希望那裏有一些該框架的文檔。 – Tom 2009-06-21 09:40:14

+0

不幸的是,他們仍然使用MD5。 – molf 2009-06-21 09:40:59

+0

噢,那麼我最好不要使用它。 – Tom 2009-06-21 09:43:23

1

我認爲上面的代碼檢查兩個框。

  • 避免彩虹表攻擊(通過鹽)
5

你實際上並沒有使用鹽

  • 安全登錄。

    鹽是一個隨機生成的字符串包含在您的哈希函數的輸入中。因此,每次都會有所不同。

    這個想法是,當用戶存儲密碼時,您會生成一個鹽,並且此鹽包含在您的數據存儲中。在進行身份驗證時,您可以檢索salt和存儲的哈希,將給定的密碼與存儲的鹽作爲前綴,並將它們一起哈希。然後將結果與存儲的散列進行比較。

  • 1

    使用鹽解決了兩個問題:

    1. 彩虹表:彩虹表只是預先計算散列,存儲與所述源值。通過比較散列值,您可以得到非哈希值(密碼)。通過添加鹽,您又獲得了另一層複雜性 - 攻擊者必須知道用於生成自定義哈希表的鹽。

    2. 散列值的差異:無鹽,相同的2個密碼生成相同的2個散列值。現在很容易看出兩個用戶是否使用相同的密碼(這裏的弱點與彩虹表大致相同,但仍然存在)。這可能不會太多,但仍然是一個值得關注的問題。

    另外,您不應該使用快速算法進行密碼散列。 md5很快,sha很快。越慢越好。

    matsano chargen博客是一個很好的(和有趣的)有關安全提示和指針的資源。