帳號安全:保護,隔離,整理


除了你的密碼管理器,你應該假設所有使用密碼的地方都明文儲存密碼。

前幾天 noarch 被我所在教育局的網課系統嚇了一跳。

有一天網課時,一個同學轉告給老師稱另一個同學忘了網課系統的密碼,無法出勤網課,並請求老師重置密碼。老師,之前也沒有使用這個平臺的經驗,瞎摸索著,看哪裡能重置學生的密碼。然而這引出了一個意外發現:他可以查到所有班上學生的網課平臺密碼,並將其用郵件發給了那個丟失密碼的同學。這件事發生時,老師還望著一些同學的奇怪密碼感嘆...

下課後,noarch 還對這件事半信半疑,認為這是一場鬧劇。直到 noarch 匿名在這個被北美諸多教育局使用的平臺註冊了一個試用帳號,才意識到了問題的嚴重性:教師真的可以查到所有學生的明文密碼。

如果你對上面的故事感到一頭霧水,noarch 給你介紹一下密碼儲存的來龍去脈。

密碼及密碼儲存的歷史

根據 Wikipedia, 密碼在古羅馬就出現了,一開始用於在軍隊中交換暗語。同樣地,密碼在計算機應用之初就被廣泛使用。

noarch 現在請你想象一個情況:黑客駭入了一個密碼資料庫,這個密碼資料庫中儲存著所有使用者用於登入這個服務的郵箱和密碼。

你應該不難想象到,這些賬戶資訊將全盤被黑客獲取。這種行為叫做“拖庫”。“拖庫”意即將資料庫匯出,但在這裡是從被黑的伺服器上下載(通常用於儲存密碼和敏感個人資訊的)資料庫。

不過你可能沒想到另一個黑客們會做的事:他們會將從一個地方獲取的密碼在其它地方嘗試,並由此獲取這一批使用者在其它服務的密碼。這叫做“撞庫”。故名思議,“撞庫”拿一個數據庫中的資料向另一個數據庫“撞”(嘗試),並由此得到更多資料。

獲取這些資料的目的當然是盈利:例如黑產者偷到了一個遊戲的使用者資料庫,他們可能會“盜號”並變賣受害者的裝備。這稱之為“洗庫”,即壓榨資料庫的金錢價值。

最後,這些經過“拖”、“洗”、“撞”的資料庫會在一個點相聚:“社工庫”。這些是包含了一群人眾多帳號資訊的資料庫。

如果 noarch 出現在了這個資料庫中,這個資料庫會包含 noarch 的 Telegram 帳號、郵箱帳號、Matrix 帳號、Instagram 帳號... 並且明確標識,這些帳號都屬於 noarch 一個人。它可能還包含所有社交工程攻擊者想要的,在線上“出道”或是線上下抓捕、綁架或謀殺(如果它包含 noarch 的詳細住址)noarch 的資訊。參考

作為服務提供商,他們當然想了很多辦法,使資料庫即使被黑客訪問,也不會全盤崩潰。

防拖庫:Hash, 加鹽

前面提到,黑客在拿到資料庫的訪問許可權那一刻,整個資料庫中的使用者名稱和密碼都將清晰可讀。除了增強資料庫的安全,使得黑客難以駭入以外,還有什麼方法能讓他們即使訪問了資料庫,也無法獲得有效的密碼呢?

答案是不直接儲存密碼,而是儲存經過一些不可逆演算法,從密碼衍生出來的資料。用來這麼做的不可逆函式稱為金鑰派生函式,它們輸出的結果叫 Hash.

這樣做為黑客們帶來了一個明顯的難題:他們將無法直接將這些密碼到其它服務上嘗試。這是因為其它的服務在收到這些 Hash 之後,會進行另一輪(實際應用中可能高達數萬輪)變換,而這些 Hash 再次進行變換後將產生一個不同的值。

不過,道高一尺,魔高一丈:既然沒法從 Hash 反推出密碼,那麼我就從零開始,從密碼推出 Hash, 並記錄它們的對應關係。如果我在資料庫中遇見一個已知的 Hash, 那麼我一定知道這個帳號的密碼。隨之而來的還有多種高效儲存 Hash 和密碼關係的方法,例如彩虹表,它可以在有限的儲存空間內列出高達 1~8 位數字字母符號混合密碼及其 Hash 的關係。

應對彩虹表也有一套辦法:作為服務提供商,他們無法強迫既有使用者將弱密碼修改成更難破解的,十幾位的強密碼;於是加鹽出現了。“鹽”的比喻在這異常恰當:“加鹽”指在既有的明文密碼上加入一堆固定的明文資料,並將明文密碼和這個附加的明文資料一起生成 Hash 並存儲。驗證密碼時,加入這同一套鹽,並與資料庫驗證密碼加了鹽後的 Hash. 這有如在烹飪時,加的鹽都是 NaCl4, 然而加了鹽後的菜式口味大不相同。

進行了加鹽和 Hash 後的密碼儲存難以被破解。這是因為加鹽使得密碼長度大大增加:例如黑客可以輕易在一個彩虹表中儲存密碼 000000999999, 然而黑客難以儲存 000000a^o2iH&JD$sO1gV8;7999999a^o2iH&JD$sO1gV8;7 的密碼 / Hash 關係。

Hash 和加鹽不能防範的

如果你本身就使用一個弱密碼(例如短密碼 2333, 或常見組合 password, qwerty, abcd1234 等),加鹽無法為其提供應有的保護。“鹽”通常是固定的,並且黑客一般知道這個“鹽”;而弱密碼本身就受暴力破解的威脅,黑客只需嘗試加了相同“鹽”的弱密碼,即可獲取一個有限但常用的 Hash 列表。

因此,要保證帳號安全,你必須設定一個強密碼,它最好長度大於 20 個字元,由至少數字字母符號組成。

防洗庫和撞庫

如果傷害已經發生,如一個大型服務被駭,其它服務可以通過驗證碼等抗指令碼方式防止自己受到波及。

但無論如何,從個人角度出發,即使是一個帳號被盜,洩露的個人資訊無法挽回,即無法阻止“洗庫”。

為什麼不能在兩個服務上用同一個密碼

請勿在兩個服務上共用密碼。

noarch 特別強調兩個是因為說多個可能會讓你產生僥倖心理,自作聰明只使用兩三個密碼;但實際上兩個服務共用密碼和十個服務共用密碼帶來的安全隱患是接近的。

上面 noarch 以服務提供商的角度講解了密碼的安全儲存。

多數 (noarch 猜測,沒有統計) 對安全有一定考量的服務都將密碼通過上述加鹽 Hash 的方式儲存。但即使對資料庫中密碼的攻擊已經被“玩爛了”,攻擊它的知識也可以隨意獲取,依然有服務存僥倖心理,或是 IT 人員技術低下,使用明文儲存密碼。就像 noarch 所在教育局使用的網課系統一樣,如果它被駭,所有北美高中生的個人資訊將受到威脅。更恐怖的是,你的老師、學校、政府能隨意讀取你在那的密碼。

如果你還共用密碼,那麼一個明文儲存密碼的服務被駭,你的所有帳號將受到立刻、嚴重的威脅。

但作為使用者你能做什麼呢?密碼的儲存方式通常也不被公開,因此你無從知道服務提供商的 IT 人員多麼無視安全。你唯一能做的,是隔離這些服務和密碼,在每個服務上使用一個不同的密碼,避免“一個被駭,全盤被駭”的局面。

noarch 在這裡所說的“隔離”僅指密碼隔離,並沒有涉及到身份隔離。身份隔離則是我們後續在享受自由言論之前:“分裂人格”的魅力中要講的話題。

你可能會說,這根本不可能!我不可能記住這麼多強密碼啊!

noarch 沒有叫你記住你使用的上千個服務的不同密碼。事實上,你只需要記住一兩個 - 大多數情況下只有一個 - 密碼就行了。

要做到只記一個密碼,卻能保證所有帳號安全,你需要用到密碼管理器。noarch 會在下一篇文章介紹密碼管理器如何工作。