為什麼不應該始終將預散列密碼與 CREATE LOGIN 一起使用?
(對於這個問題,假設我只需要支持 SQL Server 2008 及更高版本。或者為了讓這個問題過時,比如說最近的、目前的和近期的版本。)
該聲明的文件
CREATE LOGIN
說(強調我的):HASHED 僅
適用於 SQL Server 登錄。指定在 PASSWORD 參數之後輸入的密碼已經過散列。如果未選擇此選項,則作為密碼輸入的字元串在儲存到數據庫之前會經過雜湊處理。**此選項應僅用於將數據庫從一台伺服器遷移到另一台伺服器。不要使用 HASHED 選項來創建新的登錄。**HASHED 選項不能與 SQL Server 7 或更早版本創建的雜湊一起使用。
沒有解釋為什麼不應該使用這個選項來創建新的登錄,如果有原因,這並不明顯(至少對我來說)。
該文件引用了 KB918992,雖然有點不清楚,但描述了指示舊版(2000-2008 R2)密碼雜湊自動升級的步驟。因此,我可以獲取在 2000-2008 R2 和
CREATE LOGIN ... WITH PASSWORD ... HASHED
2012(+?)上生成的密碼雜湊,並在主體第一次登錄時將雜湊轉換為 2012 格式。我測試過這確實像描述的那樣工作。密碼雜湊本身似乎有一個 6 字節的簽名/元數據標頭,由我認為是 2 字節的標籤/版本和 4 字節的鹽組成。升級雜湊時,標籤/版本會增加,而鹽保持不變。
那麼問題是:如果微軟已經融入了這種未來的兼容性(我認為未來需要維護),那麼有什麼理由不應該使用這種方法來創建新的登錄名?
散列方法可能是一個實現細節,在未來的版本中可能會或可能不會改變(因為它至少已經有一次)。如果您嘗試在較新或較舊的版本上執行它們,他們告訴您不要這樣做,以免除自己破壞腳本/自動化的責任。部分支持純粹是為了允許遷移登錄。
在此過程中的某個時刻,您將不得不使用明文密碼來生成散列密碼,所以我不確定您是否真的通過提供預散列密碼獲得了很多收益。