2012-02-24 55 views
1

我目前工作日誌的形式和我聽說來存儲密碼是哈希他們最好的方式,但我把「哈希」密碼數據庫(在列只有字節數據類型放置)我把字節數據庫中,然後檢索然後將其轉換爲字符串來比較它們與用戶的輸入是它是如何工作的?如果是這樣,我會怎麼做LINQ TO SQL?散列密碼數據庫的LINQ to SQL

+0

不要在計算中使用它的值數據比較字符串。比較字節。 – Kamil 2012-02-24 17:21:29

+0

爲什麼?如果散列產生一個字符串會怎麼樣? – 2012-02-24 17:24:42

+0

我正在使用加密,但每次我散列相同的密碼,他們所有人都有不同的價值,我怎麼會知道他們都匹配? – user962206 2012-02-24 17:27:43

回答

3

我覺得一般的做法是鹽/哈希存儲在數據庫中他們當用戶創建自己的帳戶密碼。然後,驗證用戶salt /散列用戶的輸入並將其與數據庫存儲的密碼進行比較。

+0

有沒有在線實施?或完整的指南或示例 – user962206 2012-02-24 17:26:50

+0

@ user962206說實話,你可能不應該從頭開始編寫自己的認證系統,你應該利用現有的認證系統。爲了回答你的具體問題,是的,有很多人在做這個在線的例子。即使大多數寫它的人沒有在生產環境中使用他們自己的代碼,這也是一種常見的學術練習。 – Servy 2012-02-24 18:00:45

2

當用戶試圖驗證您使用他們輸入密碼相同的散列算法和搜索數據庫中與輸入的用戶名和匹配你剛纔生成的一個散列的用戶。如果你得到一個結果,那就是用戶認證它們。

注意,在任何時候,你帶的哈希並將其轉換回明文密碼。散列的全部目的是它是你不能做的事情(至少在實際意義上是這樣)。它沒有加密,這不是雙向的。一旦哈希,如果你可以將其恢復爲原始密碼,那麼你就不會使用足夠好的哈希算法。

2

有散列和加密之間的兩個主要區別:

1)當你哈希例如密碼,結果是唯一的,但是當你進行加密,其結果應該是隨機的,每次你加密的相同數據。

2)散列是單向的,加密是雙向的,這意味着檢索的哈希數據是沒有意義的,但你可以解密加密的數據。

這裏可能會出現一個問題:何時應該使用哈希和使用加密?

答案很簡單。如果你不想向用戶顯示真實的數據,或者你不想在你的程序的任何地方使用它,它只用於驗證或驗證(如登錄密碼),使用散列和保存散列表是明智的數據庫中的數據。在進行身份驗證時,只需簡單地對輸入進行哈希處理,而且由於哈希法給出了與搜索所需表相同的結果以查找其匹配項。在另一方面,加密用於我們可能需要將其展示給用戶或(打印費顯示什麼付款是由信用卡支付時,顯示其信用卡號碼)