從 Substack 的登錄設計了解 2FA 雙因子認證

我經常談區塊鏈和其他 web3 相關技術,即使有人認為沒事找事,甚至全是一場騙局,web2 和中央管治才是王道,相信也必然同意,資訊安全非常重要。

在當今資訊社會,資安已經成為顯學,不學上一招半式,只有吃虧的份。接下來我會寫一下資安相關的話題,讀後你會發現,是否認同 web3 都好,資安跟密碼學的關係,密不可分。


資安低掛水果:2FA

如果有人問我,想要做好資安首要工作是甚麼,我會毫不猶豫地回答是 2FA,即 Two-Factor Authentication,雙因子認證。

是的,相較於擁有一個很強的密碼但缺乏第二重防禦,我寧願用戶的密碼是「123456」,但受到第二層驗證碼保護。當然,我只是說非得二選一的話我會這樣選,而絕非建議弱密碼,讀者可不要輕率看待密碼,被駭之後找我晦氣。不妨這樣說,2FA 是資安的「low hanging fruit」,花個五分鐘打開 2FA,保安程度馬上大幅提升,被駭的機會率至少降低九成。

近年生成式 AI 突飛猛進,每當有個 Alice 說擔心人類會被 AI 淘汰,就會有個 Bob 跑出來指正,其實我們不需要勝過 AI,只需要比其他人多懂一點 AI,被淘汰的就會是其他人。會否被駭也是同一道理,作為普通用戶,你不需要比駭客技勝一籌,只需要防禦贏過其他用戶就足以幸免於難——當大把沒打開 2FA 的帳號等著駭客予取予攜,他們何必大費周章去駭你的帳號?這就是我有信心說只要打開 2FA,被駭機率隨即大降九成的原因。

不過請注意,以上說的是「普通用戶」,如果你「上頭」被特別關照,以上邏輯並不適用。數位入侵有是否目標性攻擊之分(untargeted attack vs targeted attack),進行非目標性攻擊,駭客會選方便就手的,就好像街頭有一大堆單車,要偷當然選車鎖最弱的,你的鎖只要比別人好上一點,單車就不會被盜;目標性攻擊卻是另一回事,你的單車是輛林寶堅尼,賊人非要偷到手不可,這就變成貨真價實的攻防戰,你的盾必須擋得住對方的茅,單純贏過其他用戶可保不住你。

只要花少許時間讀我的一兩篇文章並且「弄髒雙手」跟進,我敢說已經足以應付非目標性攻擊。然而,萬一你因為某些原因被盯上,對手可能來自矽谷、五角大樓、特拉維夫、莫斯科、平壤或中南海,我一介小薯可招架不住,只能盡量小心,至少提高破解的門檻,避免死得太難看。

2FA 的最重點是 F

顧名思義,2FA 是以兩個不同因子認證,用戶必須先後通過,才能取得服務使用權。

所謂「因子」,可分為三類:

  1. What you know:你知道甚麼;如密碼、出生日期、身分證號碼等。
  2. What you have:你持有甚麼;如手機、鑰匙、IC 卡等。
  3. Who you are:你是誰;即生物認證,如指模、臉、虹膜等。

當服務要求用上以上三種方式中的兩種來認證,就符合 2FA 原則。換言之,只要密碼就能進入,不算是 2FA;即使靠雙重密碼才可進入,也不是 2FA,因為儘管用上兩組密碼,還是同一種因子,也因此,有人把 2FA 翻譯為雙重認證,不是太準確。當然,雙重密碼怎麼說都比單個密碼保險一些,只是差別比較有限,有能力破解一個密碼,往往就能破解第二個密碼,只是多花點時間;2FA 就不一樣,用上另一種因子有如打開一個新維度,從一維變成二維,保安程度大大提升。2FA 的最重點不在「2」,而在「F」。

傳統上,2FA 最典型的組合是「密碼 + 驗證碼」,前者記在腦袋,後者以用戶手持的編碼器生成,或者透過短訊獲取,即用上「what you know」和「what you have」兩個因子,要破解前者往往並不困難,尤其是靠用戶腦袋記的密碼,通常強不到哪裡去,但一旦加上後者,駭客就需要另一套破解的技巧,等於打開一個全新維度,難度大幅提升。留意以上只是最常用的 2FA 組合,絕非我的建議,我一則反對用腦袋記密碼,二則反對用短訊作為第二因子,短訊容易被盜,尤其是在某些國家,我就曾第一身遇過有能力把我的短訊看光光的駭客。

說到這裡我要自打嘴巴,一開始說資安的低掛水果是 2FA,其實並不精準,真正的意思是在那些只使用密碼登錄的帳號打開驗證碼機制,下載 Google Authenticator,掃描指定的二維碼,從此以 Google Authenticator 生成的驗證碼作為第二因子作登錄。Google Authenticator 會鼓勵你把驗證碼同步到雲端,好處是這台手機壞了或者丟了還能如常登錄,但也意味著萬一你的 Google 帳號被駭,其他以此作 2FA 的帳號很可能會被牽連,因此建議不要打開雲端同步的選項。

本文先不討論更多進階的細節,比如哪家的 Authenticator 最好,作為起步,先按照以上的標準方式實行就已經不錯。我更希望先集中把 2FA 的概念說清楚,務求做到一理通,百理明。

重門深鎖但保安員輕率

「密碼 + 驗證碼」是最為典型的 2FA 組合,當涉及的服務、對資安的要求和使用的設備不同,登錄的方式也會隨之改變,比如有些服務不依產業標準,硬要自行設計「安全」守則,如強迫用戶每三個月修改密碼,密碼卻只能八位之類;比如對資安要求較高的,願意購買專門用作第二因子的登錄硬體 Yubikey;又例如電腦不一定有生物認證,智能手機則多數有,這些因素全都會影響登錄方式。不過,萬變不離其宗,要判斷個別服務的登錄方式是否安全,只需靈活套用 2FA 原則,看是否應用上兩個因子,就能知道個大概。

以下讓我們玩個遊戲,以現實例子考考大家。且看我們挺熟悉的 Substack,帳號設定裡關於 account security 的部份:

如果讀者按文章初段的建議,嘗試在 Substack 打開帳號登錄的驗證碼以收 2FA 之效,Substack 會要求你首先打開 recovery questions,設定幾條私密問題及答案,萬一丟失電郵登錄或者安裝 authenticator 的裝置時,透過回答 recovery questions 恢復帳號。

問題一:你會打開 Substack 的 2FA 嗎?

心水清的你或許早就看穿,第一張截圖已經「劇透」,Substack 是極少數我沒有打開驗證碼的線上服務之一。我明白 Substack 的好意,但 recovery questions 可說是最糟糕的登錄方式,很容易透過「社交工程」破解,比如駭客只需要友善地跟你年邁的父母聊聊天,就能得知他們在哪裏相遇。

一個系統的防禦能力等於所有攻擊面中最弱的一環,沒錯,輸入密碼後還要驗證碼才能登入符合 2FA,可是只要跟系統說丟失,你就能透過回答「私密」問題恢復帳號,這就好像你家的大門堅固而且安裝了鐵閘,不過持有兩條鑰匙的保安員熱心助人,只要穿得端莊一點跟他攀談,自稱屋主的朋友且能說得頭頭是道,就會乖乖替你開門。

Substack 的產品設計都非常用心,就連登錄也是,大概是考慮到文字創作者對資安不熟悉吧,特別使用上 recovery questions,我只能說,好意心領,但我寧可單用一組 40 字長,包含大小寫字母、數字和標點的密碼。

問題二:我的 Substack 帳號是單因子認證嗎?

這也太簡單了吧,當然啦。且慢——

當你知道、記得你的密碼,只靠密碼登錄,那就是單靠「what you know」這個因子的認證方式,這沒錯。可是,我在 Substack 用的密碼由密碼管理器 Proton Pass 生成,我記不住甚至沒看過,平時要填密碼得請 Proton Pass 代勞,而 Proton Pass 安裝在 MacBook 和安卓手機,也就是說,要密碼就需要拿到我的 MacBook 或手機,並使用指模解鎖設備才可,從這個角度看,雖然我只用密碼,但已經用上了「what you have」和「who you are」兩個因子,稱得上是 2FA。

真的該這樣理解麼?還是說,一重關卡就必然是單因子認證,我不過是強詞奪理,混淆視聽?

高重建