身分驗證(authentication)
在銀行櫃員讓你提款之前,他必須回答一個問題:你真的是你所聲稱的那個人嗎?他可能查你的身分證,或要你提供密碼加一組傳到手機的驗證碼。身分驗證在電腦裡正是這一步:在系統決定「這個身分被允許做什麼」之前,先確認一個使用者(或程式)真的就是它所聲稱的身分。它是大門——其餘一切都繫於把它做對。
經典的框架是:你可以用三類證據之一來證明身分,這些類別稱為因素:你所知的(密碼、PIN)、你所擁有的(手機、硬體安全金鑰、智慧卡)、以及你本身的(指紋、臉、虹膜——生物辨識)。以密碼這個最常見的「所知」因素為例:系統絕不能儲存原始密碼,因為一旦資料庫外洩,就等於把每個帳號都交給攻擊者。它改為儲存雜湊——一個單向函式的輸出,往前算很容易、反推卻幾乎不可能——於是它在你登入時把你輸入的內容做雜湊、再比對。為了阻止攻擊者預先算好常見密碼的雜湊值,每個密碼還會在雜湊前混入一段獨一無二的隨機加鹽,使相同的密碼也雜湊出不同結果,單一張預先算好的表就破解不了全部。多因素驗證結合兩種以上不同的因素(譬如密碼加手機驗證碼),使得只偷到其中一個並不足夠。關鍵在於,身分驗證有別於授權:身分驗證問「你是誰」,授權問「你可以做什麼」——你驗證一次,之後系統在每一個動作上檢查你的授權。
身分驗證之所以重要,是因為它是其他每一項控制所立足的基礎——存取控制、稽核與課責,全都假設系統正確知道「是誰在行動」。誠實的提醒很尖銳。密碼在實務上很弱:人們重複使用、挑可猜的、又會被釣魚,這正是為什麼強烈建議多因素。生物辨識感覺很神奇,卻有個棘手問題——指紋若外洩你換不掉它,而且它能被偽造——所以它最好當作其中一個因素,而非唯一一個。而且,沒有任何身分驗證能強過它的「復原路徑」:若帳號復原能被社交工程攻破,再完美的登入也一文不值。
你用密碼登入(所知),再在手機上核准一個提示(所擁有)——兩個因素。伺服器從不看你被儲存的密碼;它把你輸入的內容連同你帳號的鹽一起做雜湊,再與儲存的雜湊比對。即便密碼資料庫外洩,攻擊者面對的是加了鹽的雜湊,而非明文。
兩個不同因素,而且儲存的永遠只是加了鹽的雜湊。
別把身分驗證(證明你是誰)和授權(決定你可以做什麼)搞混。也要記得生物辨識並非牢不可破——外洩的指紋無法像密碼那樣重新發放,所以它最好作為多個因素之一來使用。