2010-11-18 69 views
1

我準備在github上公開一個項目。在我的項目,進行登錄認證,我有一個字符串,並強烈鍵入它作爲一個Password在開源項目中加密密碼

// Stripped down here on SO for brevity 
public class Password 
{ 
    private const string salt = "sealab2021"; 

    public Password(string password) 
    { 
     this.saltedPasswordHash = new MD5Hash(password + this.salt).ToString(); 
    } 

    public string SaltedHash { get; private set; } 
} 

顯然,如果鹽是公開檢視,鹽的一文不值。

其他人對開源項目中的密碼做了些什麼,仍然保持鹽語安全隱藏?

salt應該存在於文件系統的某個地方,並在應用程序啓動時加載?看起來像一個合理的解決方案,但如果我真的要使用github進行源代碼管理,而不是在新版本發佈時轉儲到github上,那麼該文件仍然可供公衆訪問。

回答

5

顯然,如果鹽是 公開展示,鹽的 一文不值。

不正確。您應該假設攻擊者可能知道鹽,而不是依賴於安全模式。

你的錯誤是你對整個系統使用單一的共享salt。您應該爲每個用戶使用單獨的僞隨機鹽,然後將該鹽與該用戶的密碼散列一起存儲。

我也建議使用系統,如PBKDF2bcrypt而不是簡單的鹽漬散列。

4

首先,鹽不需要是保密的。他們需要是隨機的。鹽是針對攻擊者已經損害數據庫(通常是文件系統)的情況。這意味着他們可以訪問哈希密碼和鹽。然而,鹽仍然大大增加了獲得明文密碼所需的努力。

更重要的是,登錄鹽should是隨機的和每個用戶。在創建用戶時生成一個隨機值。如果您想使用兩種鹽(每個用戶一個,每個安裝一個),請在安裝腳本中生成一個隨機值。

最後,這不是一個開源/專有的問題。這種硬編碼值可以很容易地從專有軟件進行逆向設計。