想像一個穿著帽T的人,坐在一台接了好幾個螢幕的電腦前。螢幕上滿是黑底綠字,也許還有幾條顯示百分比的進度條。這就是電影裡典型的駭客,一個電腦天才。不管他的目標是敵方間諜還是政府,憑著他的經驗和正確的按鍵順序,他遲早能入侵對手的電腦並動手腳。但這到底有多真實?真的總會有那麼一個點,讓人能駭進任何東西嗎?
想像一棟房子的木門,我們知道它能擋住大多數人;但有人可以用開鎖工具把鎖撬開,或者更走投無路的人,可能會拿斧頭或攻城槌硬闖進去。換成鐵門,你也許能用噴燈、砂輪機或炸藥把它弄開。每次你提高門的安全性,都可能找到更強的攻擊方法來突破它。資安真的也是這樣嗎?不管演算法再怎麼進步,總會有辦法打敗它們嗎?
在數位世界裡,我們沒辦法把位元做得更硬,也沒辦法寫出要更用力敲鍵盤才能破解的程式;我們用來保護自己的是數學,是難到連當今最強的電腦都解不開的問題。
在歷史上,演算法一直在改變。早期的電腦太慢,如果不用輕量的演算法,連正常使用都撐不住;而這些演算法隨著時間一個個被破解。有些只是因為電腦變得夠強,很快就能破解;有些則是被找到了漏洞,也就是能繞過演算法的數學捷徑。
不過,現在我們有一些演算法,就目前所知,不管是現在的電腦還是未來的電腦,包括量子電腦,都破解不了。數學已經強到一個程度,攻擊者與其想辦法破解演算法,不如想辦法繞過它們。我們有實際上不可能破解的演算法,以至於最大的漏洞變成人為錯誤,像是忘了鎖門,甚至在該裝門的地方留了一個洞。
我讀高中時,正好是 cyber 的黃金年代[1]。很多人的帳號被盜了。他們以為這是網際網路本身固有的弱點:只要知識和資源夠多,就一定有辦法偷走任何帳號。
我知道,其實有三種可能:
-
他們在 cyber 的電腦上勾選了「記住我的密碼」。下一個用那台電腦的人,直接就能登入。
-
密碼太簡單,被熟人猜中了。用的是生日,或家裡狗狗的名字。
-
那台電腦裝了鍵盤側錄程式,也就是 keylogger。它會記下你按過的每個鍵。這種事比你想的常見。
三種裡面,第一種最有可能。但不管是哪一種,弱點都在人,或在人用的電腦上。伺服器根本不知道發生了什麼。而且,如果服務設計得好,就算有人入侵伺服器,密碼也不應該存在那裡。
單向演算法
你在一個設計得好的網站建立帳號時,網站不會儲存你的密碼。它儲存的是用雜湊函數,從密碼算出來的一個數字。
我們來編一個很簡單的演算法。把每個字母換成它在英文字母表中的位置:a = 1、b = 2、c = 3,一直到 z = 26。一個字的雜湊值,就是各字母的數字加總。下面保留西班牙文字,這樣算式才不會變。
hola → 8 + 15 + 12 + 1 = 36
hola 是「你好」。換一個字母,變成 hora,結果就變成 42。數字不同了,乍看好像沒什麼規律,其實還是有。
重點來了。如果我只告訴你「數字是 36」,你能說出原本是哪個字嗎?從數學上來說,不能。加總會丟掉資訊。你已經不知道有哪些字母,也不知道它們的排列順序。
這種單向演算法叫做「雜湊函數」。伺服器用它來儲存密碼,至少應該這樣做。有人偷走資料庫,只會看到 36,不會知道你的密碼。接下來,他只能一直試不同的字,直到有一個算出 36。
問題是,我們這個簡單函數很好猜。試試常見的 hola 和 vida,兩個都得到 36,所以用哪一個都能登入帳號。兩個不同輸入產生相同結果,就叫做碰撞。我們的演算法到處都是碰撞:amor、roma、ramo、mora 和 pez 都得到 47。如果你的密碼是 amor,別人輸入 pez 也能進去,因為結果一樣。
為了避免這個問題,人們使用 SHA-256 這類演算法。概念相似,但複雜得多。它不是單純相加,而是把輸入的位元經過 64 輪運算混合,最後產生一個 256 位元的數字。hola 的雜湊值長這樣:
b221d9dbb083a7f33428d7c2a3c3198ae925614d70210e28716ccaa7cd4ddb79
換成第一個字母大寫的 Hola,就變成:
e633f4fc79badea1dc5db970cf397c8248bac47cc3acf9915ba60b5d76b0e88f
只改一個字母,結果就完全不同,而且看不出規律。SHA-256 的碰撞在理論上存在,因為可能的文字有無限多種,結果的數量卻有限,但還沒有人找到碰撞。也沒有已知方法能拿到一個雜湊值,再造出一個會產生它的字。不過,現在儲存密碼會用更複雜的演算法,像 Argon2 和 bcrypt。它們刻意讓計算變慢,還加入隨機成分,讓暴力嘗試更難猜中。
網站沒有存你的密碼,那它怎麼知道你輸入對了?它把你剛輸入的內容算成雜湊值,再跟儲存的值比較。兩個相同,就認定是你。
網站本身不保存密碼。員工打開資料庫,看到的是數字。資料庫被偷走,看到的也是數字。如果公司老闆,或拿著法院命令的政府,要求交出你的密碼,他們也交不出來。不是不肯給,而是根本沒有那個東西,只有雜湊的結果。設計得好的服務永遠不會告訴你舊密碼是什麼。忘記了,就只能建立新密碼,因為連他們也不知道舊的那個。
可惜,不是每個服務都這樣做。有一次,我用了 Telcel 的密碼找回程序。Telcel 是墨西哥的電信業者。結果他們直接把我的原密碼用明文寄給我。最讓我害怕的是什麼?那只是幾年前的事。
不過,一個組合接一個組合地試,直到猜中,還是行得通。如果密碼太簡單,攻擊者可能很快就猜到了。所以密碼長度很重要。我們另一篇再聊。
存取與加密
讓別人無法取回你的密碼,是很好的保護。但密碼只是一次檢查,程式碼出錯就可能把它跳過。這時候,加密就派上用場了。
加密是把訊息變成看不懂的內容,只有拿到金鑰才能解開。跟雜湊不同,這裡可以回到原始訊息,但前提是你有金鑰。
再來看另一個簡單演算法,古老到凱撒的年代就有了。金鑰是一個數字,加密時就把每個字母在字母表中往後移動那麼多格。金鑰是 3 時,hola 變成 krod:h 變 k、o 變 r、l 變 o、a 變 d。想還原,就把每個字母往前移同樣的 3 格。沒有金鑰,krod 沒什麼意思。

安全嗎?一點也不。金鑰只有 25 種。看到 krod 卻不知道金鑰的人,可以全部試一遍。只有一種會得到看得懂的字:用 1 得到 jqnc,用 2 得到 ipmb,用 3 得到 hola。遲早會靠嘗試找出金鑰。
那就再複雜一點。不要整個字都用同一個數字,每個字母用不同的數字,比如 7、2、19 和 11。這次 hola 變成 oqel。攻擊者要試的不是 25 種,而是 26^4,將近 457,000 種組合。比前一個安全得多。不過,還是可能找到可辨認的規律,讓金鑰更容易被推算出來。電腦解這種問題很快。
安全的加密演算法,會把複雜程度拉高到很難靠逐一嘗試猜出金鑰。AES 不會移動字母,它處理的是 128 位元的資料區塊,以 256 位元金鑰進行 14 輪混合運算。複雜到看不出可以輕易利用的規律,只能一把金鑰接一把地試。你的訊息、雲端照片,以及連到銀行的連線,就是靠它保護。所以,即使有人從錯誤的門闖進帳號,只要資料有妥善加密,而他沒有金鑰,找到的也只是一堆雜訊。
到底有多少把金鑰?第一個玩具演算法有 25 把,第二個有 26^4 把。AES-256 的金鑰可以有 2^256 種不同的值。全部寫出來,是一個 78 位數的數字。
想像一台每秒能試 10^18 把金鑰的電腦,也就是 1 後面接 18 個 0。這已經超過任何現有超級電腦能做到的程度。全部試完,大約需要 3.7 × 10^51 年。宇宙大約有 138 億年的歷史,所以你得等上超過 10^41 次整個宇宙的年齡。
用目前的技術,即使把地球上所有電腦都用上,也沒有人能破解 AES-256 加密。下次電影裡的駭客打字幾分鐘,就解開敵方間諜的高階加密,你就知道那有多離譜。跟拿魔杖指著鎖頭,念一句「Alohomora」就開鎖,差不多。
不過,未來還不是什麼都保證沒事。量子電腦可能更快解決某些非常特定的問題。對一些目前使用的演算法來說,原本的數學複雜度會變得很容易處理。
就公開資訊來看,目前還沒有規模足夠大的量子電腦。但等它們做得到時,我們已經準備了回應。2024 年,NIST 發布了第一批設計來抵抗量子電腦的密碼學標準。有些瀏覽器和通訊軟體已經在用了。還沒普及到每個地方,但我們沒有坐著乾等。量子電腦怎麼運作,以及我們如何防範它,另一篇再聊。
下一篇,我們要談一件你自己能掌握的事:你的密碼,以及為什麼一句長句子,比 P@ssw0rd! 這種複雜密碼更能保護你。
參考資料
- NIST. FIPS 180-4: Secure Hash Standard (SHS). https://csrc.nist.gov/pubs/fips/180-4/upd1/final
- NIST. FIPS 197: Advanced Encryption Standard (AES). https://csrc.nist.gov/pubs/fips/197/final
- Biryukov, Dinu, Khovratovich 與 Josefsson. RFC 9106: Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications (2021). https://www.rfc-editor.org/info/rfc9106
- Provos 與 Mazières. “A Future-Adaptable Password Scheme” (bcrypt). USENIX Annual Technical Conference, 1999. https://www.usenix.org/conference/1999-usenix-annual-technical-conference/future-adaptable-password-scheme
- Planck Collaboration. “Planck 2018 results. VI. Cosmological parameters”. Astronomy & Astrophysics 641, A6 (2020). https://arxiv.org/abs/1807.06209
- Shor, P. W. “Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer”. SIAM Journal on Computing 26(5), 1997. https://arxiv.org/abs/quant-ph/9508027
- NIST. “NIST Releases First 3 Finalized Post-Quantum Encryption Standards” (2024年8月13日). https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards
- Chromium Blog. “Advancing Our Amazing Bet on Asymmetric Cryptography” (Chrome 124). https://blog.google/chromium/advancing-our-amazing-bet-on-asymmetric/
- Apple Security Research. “iMessage with PQ3: The new state of the art in quantum-secure messaging at scale” (2024). https://security.apple.com/blog/imessage-pq3/
- Kret 與 Schmidt. “The PQXDH Key Agreement Protocol”, Signal (第3次修訂, 2023). https://signal.org/docs/specifications/pqxdh/
在墨西哥,「cyber」是按小時出租連網電腦的店。有時是網咖,但很多時候只是街角文具店後面擺著幾台電腦。 ↩︎

