2011-12-28 78 views
0

PostgreSQL只有MD5加密存儲密碼。,保存密碼的最佳方法是什麼?

從閱讀黑客日誌,似乎MD5本身並不是一個非常安全的方式來存儲密碼。

我一直在客戶端使用MD5 — MD5的MD5,然後再次在數據庫—處使用MD5,但我不知道這是更強大的。

首先,是否需要加強存儲密碼?第二,什麼是簡單,有效的跨語言方法?

+0

選民結束:你會介意解釋你的推理嗎? – 2011-12-28 09:02:56

+0

對存儲過程的廣泛使用,因此在移植到應用程序級別之前,傳統上都會在db級別測試所有內容。也許你是對的 - 也許我的方法已經讓我對盲目失明瞭。 – 2011-12-28 09:09:39

+0

當然,你也可以使用'pgcrypto':http://www.postgresql.org/docs/8.3/static/pgcrypto.html ...但如果是我,我只會在應用程序級別執行它:) – 2011-12-28 09:17:38

回答

8

安裝pgcrypto擴展給你一套功能和使用的工具。 其中有能力使用bcrypt,這是存儲密碼的好方法。

如果不在postgres中使用它,你可能會認爲它在你使用的語言之外。

相關鏈接:http://www.postgresql.org/docs/current/static/pgcrypto.html爲postgres部分和http://codahale.com/how-to-safely-store-a-password/爲動機/解釋爲什麼你想要使用它。

+0

偉大的鏈接!謝謝! – 2011-12-28 09:32:42

+1

啊,是的 - 很顯然,早起並沒有幫助我記憶。當用於密碼驗證時,bcrypt肯定比sha256更好(而且scrypt會更好......) – 2011-12-28 09:50:17

2

沒有必要在數據庫中做散列。只要你基礎的鹽對像可以在不訪問哈希密碼確定用戶名,它只是作爲安全到了在應用層面:

password_hash = sha256(user_name + password) 
user_id = query("SELECT id FROM user WHERE name=? and password_hash=?", 
       user_name, password_hash).first() 

或者你可以檢查兩個用戶名和密碼分開的步驟,並使用用戶ID作爲鹽:

user_id, password_hash = query("SELECT id, password_hash FROM user WHERE name=?", 
           user_name).first() 
if password_hash != sha256(user_id + password): 
    raise Exception("authentication failed") 
+0

user_name是易失性的 - 會對usr_id工作產生影響嗎? – 2011-12-28 09:10:49

+0

當然,這也可以工作:'user_id,password_hash = query(「SELECT id,password_hash FROM user WHERE name =?」,user_name);如果password_hash!= sha256(user_id +密碼):引發異常(「驗證失敗」)' – 2011-12-28 09:15:33

相關問題