本鐵人賽的主題是「身分驗證」,那第一步得先來定義一下什麼是「身分驗證」。
引用 OpenID Connect Core 1.0 所提到的術語(terminology)解釋:
Process used to achieve sufficient confidence in the binding between the Entity and the presented Identity.
直譯起來大概是:綁定(binding)使用者所宣稱的身分(identity)到某個實體(entity)的過程,且此過程與結果是可靠的。
直譯可能不好理解,可以進一步來看看這些關鍵字所代表的意義為何。
實體是一個抽象概念,它代表的是系統上的某個身分,比方說資料庫裡面的某個會員,或是 Linux 系統裡面的某個 user,甚至現實生活的「人」或「法人」,都是類似的概念。
而像 guest 或 anonymous 等,則是比較像角色(role),而不像實體一般的有存在感。
綁定指的是使用者表明了他的身分,且在資料庫裡找到對應的實體,並信任使用者代表這個實體的過程,即為上文所稱的綁定。
並不是表明身分與找到實體就能信任,通常還要經過盤問(challenge)或類似的過程,才能真正地信任該使用者確實是他所宣稱的身分。
舉一個最簡單的例子:MySQL root 沒設定密碼。因為沒有密碼,因此只要使用者提出要登入 root「實體」的請求,MySQL 就能通過身分驗證,並信任該使用者為 root。
上面的例子可能太誇張,再舉個相較安全的例子:Linux root 有設定密碼,代表有權限使用 root 實體的使用者,必須要知道對應的密碼,系統才會信任該使用者為 root。但如果開放 ssh 登入 root,對攻擊者而言,只要了解 Linux 系統,即會知道系統必定有個「實體」叫 root,接著 ssh 登入方法是使用帳號密碼,這意味著帳號為 root,只剩下猜密碼即可完成綁定,並讓系統信任攻擊者為 root。
註:輸入 root 密碼的過程,即為「盤問」。
再舉現代行動裝置比較常見的驗證方法:生物辨識技術(biometrics)是從生物體(如人類)取得獨一無二的特徵,來提供系統做為辨識目前使用者身分的資訊。比方說 iPhone 的 Touch ID 要知道操作者是不是持有者的方法,可以取得指紋,並在資料庫尋找對應的實體做綁定;或是三星手機提供的虹膜認證,也是從虹膜掃描,取得資訊再到資料庫找對應的實體做綁定。
現實生活會發生的偽造文書,如攜帶他人的證件提領他人的財產,即意圖冒充他人身分取得資源保護者的資源(銀行的錢)。這在電腦通訊領域有類似或更多偽造的問題。常見的登入系統大多使用帳號密碼驗證,包括銀行也是類似的介面,但事實上,一些常見的攻擊手法如:
這幾個攻擊手法有一個共同的特色是:無法確保訊息來源的可靠性。像「重送攻擊」是利用 server 無法確保訊息來源真的是該訊息持有人的前提下,所能做的攻擊;「網路釣魚」剛好相反,使用者無法確保網頁真的是 server 所提供的內容;「中間人攻擊」就更不用說了,兩邊都不知道中間有個人在搞鬼。
因此,在討論網頁的身分驗證時,確認請求是真的請求,回應是真的回應,是常會思考的安全性問題。如: