2011-03-16 144 views
2

尋求創建一個保存用戶信息(主要是用戶和密碼)的數據庫表。在數據庫中存儲用戶密碼/數據

  • 散列(密碼)和用戶的最佳方式是?
  • 我是否應該加密用戶的名字?
  • 如果我有一個密碼錶和另一個用戶數據表,我怎麼可以關聯/鏈接它們?

登錄是沒有問題的,問題是如何將表(數據的密碼的表和表爲每個用戶)

由於

+0

我只是散列密碼。顯然,兩者都會更安全,但我相信最好的做法是散列密碼。 – 2011-03-16 17:50:41

+0

您還應該爲每個密碼使用不同的鹽。 – John 2011-03-16 17:53:07

+0

@John,如果你對每個密碼使用不同的鹽,當你需要檢查用戶密碼是否正確時,你會如何使用正確的salt? – 2011-03-16 17:59:23

回答

3

您基本的用戶表看起來是這樣的:

User Table 
------- 
id username password 
1  mike  @#$90sDfsa 

,其中的密碼是我的密碼的哈希版本(帶salt)。

+0

是的,我同意,問題是關聯其他表的數據與麥克 – anvd 2011-03-16 17:59:11

+1

在這種情況下,你會使用一個外鍵......一個例子可能是:Post(id,title,body,user_id)其中user_id是對用戶表中的id的引用。 – 2011-03-16 18:00:20

0

我會存儲散列和表中醃製密碼與用戶數據的其餘部分。如果您真的想將密碼存儲在單獨的表中,請將用戶標識與其關聯以將密碼與用戶相關聯。通常使用強哈希算法,例如SHA251並加密密碼以防止彩虹表攻擊。我不認爲你應該需要散列用戶名。

+0

感謝貝林加,我有一個獨特的表/傳入/登錄,問題是表中的關係:用戶邁克和在另一個表中存在的關聯(個人)數據 – anvd 2011-03-16 18:01:48

+0

*不*使用加密哈希算法!使用bcrypt(http://bcrypt.sourceforge.net/) – 2011-03-16 18:04:10

+0

@Fel,這已經說了幾次了,但我們都強烈建議你只需添加UserId,Username和PasswordHash列來擴展用戶表。如果你這樣做,你的生活將會更容易。這是一個選擇嗎? – 2011-03-16 18:04:20

0

正如我上面評論,我只是散列密碼。

另外,你爲什麼要在單獨的表中存儲用戶和密碼?它們是相關的,應該在同一個表中。諸如地址之類的數據將屬於單獨的表格。

+0

不,我的想法只是通過/登錄和另一個關聯的數據,如出生,位置等表 – anvd 2011-03-16 17:57:45

1

在存儲密碼之前,您當然應該密碼。理想的是用獨特的鹽。

作爲一個散列函數,你不應該使用類似SHA- *的東西,因爲密碼散列函數被設計得很快。這使得獲得散列的人很容易以非常快的速度嘗試大量可能的密碼。

使用密碼哈希函數,如bcrypt,它被設計爲任意慢。

+0

請提出一個問題,如果我對每個密碼都有獨特的鹽,我有同樣的懷疑 - 如果您需要檢查用戶密碼是否正確,您將如何使用正確的鹽「 – anvd 2011-03-16 18:10:25

+0

您只需沿着哈希節省鹽。 – 2011-03-16 18:17:44

0

如果您絕對必須有兩個表,一個使用哈希/鹽漬密碼,另一個使用用戶信息,您可以使用代理鍵來執行表之間的關係。

你可以有一個設置是這樣的:

CREATE TABLE users (USER_ID INTEGER, 
        PASSWORD_ID INTEGER, 
        USER_ATTRIBUTE VARCHAR(30)); 
CREATE TABLE passwords (PASSWORD_ID INTEGER, 
         PASSWORD_HASH VARCHAR(255)); 

PASSWORD_ID是代理鍵,您可以使用它在用戶表中的密碼錶參考價值。您可以使用SQL查詢將表連接在一起:

SELECT * 
FROM users INNER JOIN passwords 
    ON users.PASSWORD_ID = passwords.PASSWORD_ID; 
+0

雖然我不會在任何系統中使用稱爲「密碼」的表,因爲它是一個成熟的黑客對象... – 2011-03-16 19:16:59