Hash
用使用者名加鹽密碼?
鹽應該是唯一的,這樣攻擊者就不能一次暴力破解多個密碼。但是,由於使用者名是唯一的,難道不能使用使用者名的某些表示作為鹽嗎?
當然,這意味著如果使用者名發生更改,則需要重新散列密碼。我是從密碼學的角度而不是從使用者體驗的角度來問的。
但是,由於使用者名是唯一的
$$ … $$
但是同一個使用者在更改密碼時應該得到新鮮的鹽。正如您所建議的那樣,鹽不應該綁定到使用者名;它們綁定到各個密碼數據庫條目的狀態。如果攻擊者在您的場景中獲得了同一使用者的多個密碼條目,這些條目將具有相同的鹽,因此他們可以節省工作量。
一個實際的例子是考慮到許多密碼儲存 API 都經過精心設計,通過將過程分解為這兩個操作來避免鹽濫用:
- **生成密碼令牌:**將密碼作為輸入,並生成密碼驗證令牌作為輸出。該令牌包含:
- 所用算法的描述以及重新執行它所需的任何參數;
- 隨機鹽(由 API 操作在內部生成);
- 原始密碼雜湊輸出。
- **驗證密碼:**將密碼和驗證令牌作為輸入,當且僅當密碼與令牌簽出時才輸出 true。內部是這樣的:
- 解碼令牌以確定算法、參數、鹽和原始雜湊;
- 使用此資訊來選擇密碼散列算法和參數;
- 使用這些選項對提供的密碼進行雜湊處理;
- 將生成的原始散列與儲存在令牌中的散列進行比較。
當您使用這樣的 API 來管理使用者的密碼時,您不僅在註冊新使用者時呼叫操作 #1,而且在現有使用者更改密碼時呼叫操作 #1。這意味著新的鹽是重新隱式生成的,並且您不能犯為同一個使用者重複使用相同的鹽的錯誤。
此外,使用者名是可以廣泛預測的,就像密碼一樣(或者更是如此!)。值得注意的是,攻擊者甚至可能在他們看到您的密碼數據庫之前就猜到了您的大量使用者名。這意味著使用者名鹽在某種程度上會受到預計算攻擊——如果你的方案被廣泛採用,攻擊者可以根據以下對預計算彩虹表:
- 通用密碼(已經是眾所周知的做法);
- 眾所周知的普遍使用者名,或者極有可能在少數感興趣的人群中使用(例如,外國對手的有影響力的政治家)。
這意味著儘管密碼鹽是非秘密的,但理想情況下它們也應該是不可預測的。起初這聽起來有點矛盾,但它的意思是攻擊者不應該在他們真正看到條目之前猜出密碼條目的鹽可能是什麼。隨機鹽微不足道地通過了這個測試;使用者名在該標准上得分不高,@cypherfox 的“站點標識符”或計數器也沒有。