第 5 週:Web3 數位帳戶與安全防護

115/10/12 ~ 115/10/18 | 授課教師:馬可博士 / 李正冬 | 淡江大學 資訊管理學系

上一堂課我們談的是「Web3 的商業模式」——五年下來,哪些商業模式活了、哪些收攤了。這一週要把鏡頭轉到另一邊,問一個更貼身的問題:我們的數位加密錢包,裡面到底有什麼?誰有辦法把錢,甚至把錢包拿走?憑什麼?我要先講一件不太舒服的事:2025 年 2 月,一家全球排名前幾大的加密貨幣交易所被搬走了約 15 億美元,而他們的私鑰沒有被破解、硬體錢包沒有被打開、多簽機制也沒有被繞過——每一位簽名的人,都簽下了他們以為自己正在簽署的交易。這一週我們要把「簽名」這件事情拆開來看,因為在 Web3 裡,簽名就是同意,而同意就是授權。

📋 本週學習目標

  • 說明私鑰、公鑰、地址三者的單向推導關係,並解釋為什麼「單向」就是安全的全部基礎
  • 解釋助記詞(BIP-39)與 HD 錢包派生機制,說明一組 12 個英文單字為什麼能代表無限多個地址
  • 比較 EOA 與智慧合約錢包(ERC-4337)的差異,指出帳戶抽象解開了哪三件原本被焊死的事
  • 說明 EIP-7702(Pectra 升級,2025 年 5 月)如何讓既有的 EOA 不搬家就升級為智慧帳戶,並用公開數據判斷它是否已經進入主流
  • 分辨三種把資產拿走的路徑——授權、簽名、盲簽與前端劫持——並各舉一個真實案例
  • 完成一次簽名鑑識與錢包授權健檢,寫出屬於自己的自保守則

⏱ 預估閱讀時間:約 70~90 分鐘 | 關鍵詞:私鑰、公鑰、地址、簽章、助記詞、BIP-39、HD 錢包、冷熱錢包、EOA、帳戶抽象、ERC-4337、EIP-7702、UserOperation、Bundler、Paymaster、approve、Permit、Permit2、盲簽、前端劫持、錢包清空器

5.1 開場 — 15 億美元的手術:他們簽下的每一筆都是「合法」交易

上一週結束時,我們留下了一個懸念。在第 3 章的結尾我問過大家:Reddit 頭像的持有者最後必須把 12 個字的助記詞用雙手抄下來,因為平台要退出代管了。當時我說那是「擁有」的代價——現在我們要來探討這個代價。這一週沒有商業模式分析,也沒有代幣經濟學;這一週只講一件我們在 Web3 世界裡每天都要做的事,而且每一次做錯都可能讓我們歸零的事:簽名。

先講一個真實的開場。2025 年 2 月,全球交易量數一數二的加密貨幣交易所 Bybit,發生了一件至今仍被稱為「史上最大單筆竊案」的事件。被拿走的是約 40 萬顆以太幣,及相關的質押衍生代幣,以事件當時的市價計算約 15 億美元(不同來源的公開估值落在 14.6 億至 15 億美元之間,本教材後續統一以「約 15 億美元」表述)[10]。消息傳出的當天,整個市場的鏈上分析師、交易所風控部門、各國執法單位同時進入最高警戒,因為這種規模的資金外流,往往牽動的是整個產業的信任基礎。

但這個案子之所以值得放進教科書的第一頁,不是因為金額,而是因為它被偷的方式。請注意,以下這幾件事通通沒有發生:Bybit 的私鑰沒有被破解,他們的冷錢包沒有被實體入侵,他們的多重簽名機制(需要多把鑰匙才能動用資金)也沒有被繞過。也就是說,所有我們在這一週前半段要講的密碼學防線——256 位元的私鑰、橢圓曲線的單向性、硬體錢包的離線簽章——在這個案子上全部正常運作,一把鎖都沒有被撬開。

這起攻擊的實體路徑是這樣的:攻擊者先駭進 Safe{Wallet} 開發人員的電腦,拿下開發環境後,直接在 Bybit 簽署交易的網頁前端,埋了一段惡意的 JavaScript。結果,當 Bybit 的操作人員看著螢幕,確認是一筆「收件人正確、金額正確」的例行交易並準備簽名時,資料被瞬間調包。真正送進硬體錢包裡執行的,是另一筆轉給攻擊者的交易。操作人員眼睛看到的畫面,和晶片裡處理的,根本不是同一件事[10]。

這一段值得你把畫面記牢:你看到的,和你簽下的,不一定是同一個東西。

拿另一個數字來對比

為了讓你知道這 15 億美元有多誇張,我們拿一個全年統計當對照。區塊鏈安全公司 ScamSniffer 每年追蹤「簽名釣魚」(誘使你簽下一個有害的簽名)造成的損失,並在 2026 年 1 月發布了 2025 年的年度報告:這一年,全 EVM 生態系(含以太坊主網與 BSC、Polygon 等相容鏈)因簽名釣魚損失的金額是 8,385 萬美元,受害人數 10 萬 6 千人[9]。換句話說,Bybit 這一場社交工程操作的代價,大約是全世界一整年所有簽名釣魚損失的 17 倍。它不是「又一次簽名釣魚」,它是完全不同量級的攻擊手法——而它的技術本質是「讓人在正確的畫面上簽下錯誤的交易」。

本週的核心提問:如果防線(密碼學)沒有被攻破,那麼漏洞一定在別的地方——在「人」與「畫面」之間的某個環節。這一週我們要把那個環節找出來,並且了解怎麼在它面前站穩。我們會依序走三條路:先看鑰匙的物理學(5.2,私鑰、公鑰、助記詞是怎麼運作的),再看錢包這個載體本身正在怎麼被重新設計(5.3,帳戶抽象把「一把鑰匙管一切」改成可編程的規則),最後才進到真實的攻擊現場(5.4,授權、簽名、盲簽三種把錢拿走的方法)。5.5 你們要分組動手,做一次真實的簽名鑑識與授權健檢。

🤔 課堂互動:先不要查資料,用你的直覺回答:如果有人要拿走你銀行帳戶裡的錢,他需要什麼?如果有人要拿走你 Web3 錢包裡的資產,他需要什麼?把兩個答案各寫一行,放在手邊——讀完 5.2,你會知道自己漏掉了哪一個關鍵條件。
我們先從最底層的東西開始:那串看起來毫無意義的亂碼。它是整個 Web3 世界的根,也是這一週所有風險的來源。

5.2 錢包的物理學 — 私鑰、公鑰、地址與簽章

這一節的任務,是把「錢包」這個詞從你的日常直覺裡拆開。你手機裡的其他 App 都是帳號密碼制:忘記密碼可以重設,帳號被盜可以找客服。Web3 的錢包不是這樣運作的——它不是「一個帳號」,而是一組數學關係。把它想成物理定律會比想成軟體更貼近事實,因為這裡沒有客服、沒有後台、沒有「重設」按鈕,只有數學。

一、私鑰:一把 256 位元的鑰匙

一切從「私鑰」(private key)開始。私鑰不是一個檔案,也不是一組我們過去熟悉的密碼,而是一個256 位元的隨機數字。我們可以把它想像成擲一枚硬幣 256 次,把正反面記錄下來——只不過在電腦裡,它是一串 64 個十六進位字元的字串,長得像這樣:0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80(這是開發工具 Hardhat 的公開測試帳號第 0 號,不是真實資產帳號)[17]。

這個數字有多大?2 的 256 次方,大約是 1.16 乘以 10 的 77 次方——也就是 1 後面接 77 個零。這個數量有多荒唐,值得我們花十秒感受一下:在我們物理上能觀測到的極限範圍內,宇宙中所有星系、塵埃與生命的原子總和,大約就是 10 的 80 次方。這已經是人類所能理解的最大實體基數。也就是說,地球上的每一台電腦、每一顆硬碟、每一個資料中心能儲存的位元數加起來,都遠遠不及「所有可能的私鑰」的數量。所以當有人說「暴力破解私鑰」時,我們要能判斷這句話是不是胡說:假設有一台超級電腦每秒可以猜測 10 億組私鑰,讓它從宇宙誕生那一刻開始跑,跑到今天也才試過 10 的 26 次方種組合——連全部分佈的兆分之一都不到。

理解這個數量等級有兩個實用價值:

第一,你可以放心:真正的風險從來不是「私鑰被算出來」,而是「私鑰被拿走」——被騙走、被偷走、被你自己存到雲端硬碟裡同步出去。

第二,你可以馬上識破一類常見的詐騙話術:任何聲稱「可透過算力猜出你的私鑰」的服務,在數學上就是不可能的;反過來說,任何要你把私鑰或助記詞「輸入到某個網站驗證」的人,就是在直接索取你的全部資產。

二、公鑰與地址:只有一條單向的路

有了私鑰,接下來是兩個由它推導出來的東西。用橢圓曲線密碼學(以太坊使用的是名為 secp256k1 的曲線)的一個單向函數,可以從私鑰算出「公鑰」(public key);再把公鑰做一次雜湊運算(Keccak-256,取結果的後 20 位元組),就得到你平常在錢包裡看到的那串「地址」(address)——長得像 0xf39f...2266 的 42 個字元[16]。請注意:上一個小節那個 0xac09 開頭的測試私鑰,把它丟進單向函數裡,再算出來精準的地址正是 0xf39f...2266。兩個字串長得完全不一樣——這不是巧合,這就是「單向」的意思:把我們手上的私鑰丟進去,瞬間就能產出地址;但要是有人想拿著地址回頭去反推私鑰,那是一條在物理上完全走不通的道路。

整條路徑的關鍵字是「單向」:私鑰可以算出公鑰,公鑰可以算出地址,但反向推不回來。這是刻意的設計,不是實作偷懶。橢圓曲線上的乘法很容易做(電腦瞬間完成),但要從乘積反推乘數,目前已知最快的演算法需要的時間遠超過宇宙年齡。這件事的意義在於:我們的地址可以公開給全世界,公鑰可以在鏈上被任何人看到,而我們的私鑰依然安全——單向的路回不了頭。

三、簽章:簽名不是交易,但一樣能拿走我們的錢

現在講這一節最重要的一件事。我們持有私鑰最實際的用途,不是「解鎖錢包」,而是簽章(signature):用私鑰對一段訊息產生一組數學證明,而任何人只要拿到我們的公鑰與那段訊息,就能驗證「這段訊息確實是由這個私鑰的持有人同意的」。注意這句話裡的兩個角色——產生簽章需要私鑰,驗證簽章只需要公鑰。這就是為什麼鏈上交易可以被全世界的節點獨立驗證:驗證方不需要知道你的秘密。

接下來是關鍵,請慢慢看:簽章不等於交易。一筆鏈上交易要成立,需要付 Gas 費(手續費)、需要被打包進區塊,需要真的上鏈。但一個簽章可以先在鏈下產生,此時沒有上鏈,不付任何手續費。然而只要那個簽章的內容是「我同意某個合約動用我某個代幣的某個額度」,那麼拿到這個簽章的人,隨時可以自己付 Gas 把它送上鏈,把你錢包裡的東西搬走。這裡必須徹底打破我們用傳統軟體的直覺。我們把這兩個動作在物理上拆開看:

・「送出」交易:主動連網、付 Gas 費,把資料推上區塊鏈。

・「簽名」授權:只是在裝置上用私鑰蓋個章,不上鏈、不扣手續費。

這一小段是 5.4 整節的伏筆,也是整個 Web3 資安教育裡最該被提早教的一件事:錢包跳出的「確認」有兩種,一種會讓你付手續費,一種不會;而後者才是詐騙最愛的那一種。最常見的錯誤直覺是「我又沒按送出,應該沒事吧」——這一句話,就是 2025 年最大單筆釣魚案(650 萬美元)的完整成因。

四、助記詞:12 個英文單字是怎麼回事(BIP-39)

私鑰是 64 個十六進位字元,要你抄下來並保存 20 年,顯然不人性化。所以業界用一個巧妙的辦法把它「人性化」:把一個隨機數字轉換成 12 個(或 24 個)英文單字。我們打開任何一個錢包 App,選擇「建立新錢包」時看到的那 12 個詞,就是這個東西——它叫「助記詞」(mnemonic phrase),標準名稱是 BIP-39[6]。

它的運作方式其實比想像中簡單,而且值得我們搞懂,因為懂了才不會被騙。

第一,電腦先產生 128 位元的隨機資料(稱為「熵」,entropy)。

第二,把這 128 位元做一次 SHA-256 雜湊,取結果最前面的 4 位元,當作「校驗碼」(checksum)接在後面——所以總共是 132 位元。

第三,把這 132 位元每 11 位元切一段,一共切出 12 段;每一段是一個 0 到 2047 之間的數字。

第四,BIP-39 規格定義了一份剛好 2,048 個英文單字的詞表,第 0 號是 abandon、第 2047 號是 zoo,每個數字對應一個單字。把 12 個數字換成 12 個單字,你就得到了那串英文[6]。

這裡有兩個重點。👀第一個是詞表的設計:2,048 個字是刻意挑過的,每個字的前四個字母在整份詞表裡都是唯一的。這是為了讓你在紙上抄寫時,只要寫下前四個字母(例如 abando、zoo)就能唯一還原——因為這個標準誕生的年代,人們是真的把它寫在紙上的。👀第二個是那個 4 位元的校驗碼:它讓「順序寫錯」或「其中一個字抄錯」這種失誤,在還原錢包時有 15/16 的機率被立刻偵測出來並拒絕。這是 BIP-39 留給人類的一道人為防線,因為人類一定會抄錯。

而這 12 個字的最終用途,是當作「種子」再推導出私鑰:實際運作上,助記詞經過一組標準化的延伸與雜湊流程(BIP-39 的 seed 推導),產生一個 512 位元的種子,再往下生成無窮多個私鑰。所以助記詞的位階比私鑰更高——私鑰只是它派生出來的其中一個結果。這就是為什麼資安鐵則是「助記詞等於全部資產」,也是為什麼任何要我們輸入助記詞的網頁、客服或表單,無論理由多合理,都是詐騙。唯一的例外是 5.5 課堂活動用的那組示範字串——它背後沒有任何真實資產,而且網址由老師在投影片上明示;除此之外,沒有第二個例外。

五、HD 錢包:為什麼一個 App 裡有一堆地址

現在回答前面埋的那個問題。假設我們的助記詞可以生成無限多個私鑰,那要怎麼管理「第幾個私鑰」?答案是透過一套稱為 HD 錢包(Hierarchical Deterministic Wallet,階層式決定性錢包)的標準:BIP-32 定義了「一棵樹」的推導規則,BIP-44 則定義了樹上每一層的編號慣例[14][15]。

用日常語言說:種子(助記詞)是樹根,往下每一層都有一個編號。具體來說,我們在錢包裡看到的「推導路徑」通常長這樣:m/44'/60'/0'/0/0。這其實就是一串數位門牌,由大到小層層定位:

所以同一組助記詞,可以在比特幣、以太坊和Solana 上各自有一整排地址;也可以在同一個鏈上開出多個帳戶。12 個詞是身分,路徑是門牌號碼——這是我希望大家帶走的那個比喻。

這件事有一個很實務的後果,也是詐騙集團最愛利用的認知落差:「把助記詞匯入另一個錢包 App,資產就會出現在那裡」,這是對的,因為資產從來不在 App 裡,而在鏈上,App 只是那把鑰匙的介面。反過來說,當一個網站說「請你輸入助記詞以同步資產」時,它其實是在說「請你把鑰匙交給我」——而它拿到鑰匙之後,會在你自己的錢包裡把你的資產全部轉走,你也會在鏈上看到一筆完全合法,而且由你的私鑰簽名的交易紀錄。上鏈後,沒有任何機構能撤銷它。

🤔 即席小練習(請在筆記上寫下答案):你看到一條推導路徑 m/44'/60'/0'/0/3。請問它是「第幾個帳戶」的第「幾個地址」?寫完之後,回頭對照前面那句「12 個詞是身分,路徑是門牌號碼」——同一個身分,可以掛上多少個門牌號碼?

六、冷錢包與熱錢包:一條光譜,不是二分法

把以上學到的東西整理成一個實務問題:既然私鑰是唯一的那把鑰匙,那把鑰匙平常應該放在哪裡?業界慣用的分類是「冷錢包」與「熱錢包」,但我在課堂上更希望你把它們理解成一條「連網程度」的光譜,因為真正決定風險的不是名詞,而是「私鑰有沒有接觸過網路」。

型態私鑰存在哪適合放多少主要風險
交易所託管不在我們手上(交易所代管)交易用週轉金交易所倒閉或被駭,我們只是債權人
手機/瀏覽器熱錢包我們的手機(連網)零錢包、互動用惡意網站、假 App、手機遺失或中毒
硬體錢包專用晶片(離線簽章)主要資產盲簽(畫面沒顯示交易內容)、供應鏈詐騙、助記詞自己抄錯
多簽錢包分散在多把鑰匙/多台裝置組織資產前端被劫持、簽署人數門檻設太低

這張表有個重點:往光譜的下方走,安全性提高,但「使用者體驗」變差,而且「人為失誤」的權重變大。硬體錢包的晶片不會在網路上被偷走私鑰——這是真的——但硬體錢包仍然可能敗在最後一步:當它請你「確認這筆交易」時,如果你按下的是一筆自己看不懂的交易,你等於是在一張自己讀不懂的授權書上簽名——金額或權限早就寫好了,只是你沒有能力核對。2024 年 10 月,一家叫 Radiant Capital 的 DeFi 協議被拿走超過 5,000 萬美元,用的正是多簽加上硬體錢包——他們每一道密碼學防線都是完整的,卻在最後的「確認」上失守[11]。這個案子是 5.4 節第三小節的主角。

鑰匙的物理學講完了:私鑰是不會被算出來的,但可以被拿走;簽章不上鏈能造成重大損失;助記詞比私鑰位階更高;地址可以公開;而連網程度的光譜越往安全端走,人的失誤就越會成為唯一的破口。接下來要看的,是業界這幾年怎麼重新設計「錢包」這個載體——因為「一把鑰匙決定一切」這個設計,本身很容易發生問題。

5.3 從 EOA 到帳戶抽象 — 錢包為什麼正在被改寫

上一節的最後一句話:光譜越往安全端走,「人為失誤」的比重越大。這句話聽起來像廢話——人本來就會失誤。但對設計系統的人來說,它是一個非常具體的工程問題:如果一把私鑰決定一切,那麼任何一次失誤都沒有補救的空間。這一節要講的,正是業界花了整整十年在修補的一個設計缺陷,以及它現在的進展。

一、EOA 的代價:一把鑰匙決定一切

在 5.2 講到的帳戶,標準名稱叫 EOA(Externally Owned Account,外部持有帳戶)。「外部」的意思是:這個帳戶由區塊鏈之外的東西(私鑰)控制,它本身沒有程式碼、不會思考,也不能拒絕任何由正確私鑰簽出的交易。這個「外部」是相對於「鏈上的智慧合約帳戶」來說的——後者的程式碼就住在鏈上,自己就是一個帳戶;而 EOA 沒有程式碼,控制它的東西在鏈外。它就像一扇只有一個鑰匙孔的門——鑰匙是對的門就會開,不會管你是誰、什麼時間以及為了什麼。

這個設計非常優雅,也確實支撐了比特幣與以太坊最初的十年。但把它放到一般人的日常使用上,代價就一項一項浮出來,而且每一項我們都會覺得「太不合理了吧」:

把這五項並排看,你會發現它們不是五個 bug,而是同一個根源:EOA 把「誰付費」、「什麼算有效簽章」、「一筆交易能做幾件事」這三件事,全部寫死在協議層。這是「帳戶抽象」要解決的問題——不是把安全拆掉,而是把這三件事解耦,讓錢包開發者可以自由設計。

二、ERC-4337:把三件寫死的事拆開

以太坊社群為此提出了一個不需要改動底層協議的標準:ERC-4337(帳戶抽象,Account Abstraction Using Alt Mempool)。它在 2023 年 3 月正式在主網上線[1],核心想法很聰明——既然不能改協議,那就在協議之上,用一套「影子交易系統」繞過去。

它的運作有三個角色,請依序記住:

第一,UserOperation(使用者操作)。這是一個「長得像交易、但不是交易」的資料結構。它裝著使用者的意圖:要做什麼(callData)、願意付多少手續費、用什麼簽章,以及要不要請人代付。它被丟進一個獨立的記憶池(alt mempool),和一般的以太坊交易分開排隊[1]。

第二,Bundler(打包者)。這是網路上的一種節點,工作是把記憶池裡的一大堆 UserOperation 收集起來,先離線模擬確認它們會成功,然後打包成一筆真正的以太坊交易送出。Bundler 賺的是「使用者付的手續費」與「實際上鏈的成本」之間的差價[1]。

第三,EntryPoint(入口合約)。這是每個鏈上的一個固定合約,所有打包好的操作都送進這裡。它的工作按順序做三件事:先請每一個智慧合約帳戶驗證(這筆操作是否被正確授權)、再執行(做那些操作要做的事),最後結算手續費。驗證與執行被拆成兩個階段,是這個設計最關鍵的地方——因為「驗證邏輯」現在是由我們的錢包合約自己決定的,不再是協議寫死的[1]。

另外還有一個可選角色:Paymaster(付費者)。它是一份合約,可以代替使用者付手續費。應用程式可以存一筆錢在裡面,讓新用戶「不用先買 ETH 就能用」。所以抽象帳戶的第一個殺手級體驗就是:Gas 代付[1]。

三、帳戶抽象解鎖了什麼

一旦「誰付 gas、什麼算有效簽章和一筆交易能做幾件事」可以被程式設計,前面那五項 EOA 的限制就一條一條鬆開了。以下這幾種能力,是從此以後判斷「這個錢包是不是新世代產物」的依據:

四、EIP-7702:不搬家也能升級

ERC-4337 有一個推廣上的現實困難:舊錢包都是 EOA。若要要享受抽象帳戶的新功能,就必須「搬家」——把資產轉到一個新地址。實務上沒幾個人願意。為了解決這群不想搬家的使用者,以太坊在 2025 年 5 月的 Pectra 升級中,從側面硬生生開出了一條新路:EIP-7702[2][5]。

它做的事說起來很簡單,但後果很深遠:讓一個 EOA 可以「暫時」把自己的帳戶委託給一份智慧合約。我們簽下一份授權,指向某一份合約程式碼;從那一刻起,當有交易送到這個地址時,執行的是那份合約的邏輯。地址沒變,資產沒變,但帳戶行為開始像一個智慧錢包[2]。

三個必須記住的細節:

第一,私鑰仍然握有完全控制權——這不是把帳戶交出去,而是「允許自己在這個地址上跑某段程式」。

第二,委託可以隨時解除,只要把委託指向空地址(零地址)就會恢復成一般 EOA[5]。

第三,這件事有一個容易被忽略的副作用:過去開發者有兩個很方便的假設——「有程式碼的就是合約,不是個人」,以及「一筆交易的發起者(tx.origin)一定是一般帳戶」。EIP-7702 之後,這兩個假設都不再成立,因為一個屬於個人的帳戶現在也能掛上合約程式碼。官方指引因此要求開發者改用更保守的前提:「系統中的任何參與者都可能是智慧合約」[5]。你會在 5.4 看到這個「副作用」如何立刻被攻擊者拿來利用。

五、這條路走到哪了:2026 年的實測數字

一個新標準如果只是「技術上可行」,對我們沒有意義。所以看數字,追蹤智慧帳戶生態的公開儀表板 BundleBear,我在 2026 年 10 月 13 日讀到的數據是這樣:

指標數值怎麼讀它
ERC-4337 累計 UserOperation約 13.2 億筆這條路不是實驗,是每天在跑的產線
曾發出 UserOperation 的帳戶數約 6,900 萬個約當台灣總人口(約 2,300 萬)的 3 倍;注意這是累計帳戶數,不是人數
EIP-7702 有效委託的錢包數約 6,550 萬個上線約一年半,委託中的錢包數已接近 ERC-4337 累積三年半的帳戶規模
EIP-7702 累計授權筆數約 2.66 億筆「不搬家也能升級」確實打得中真實需求
Paymaster 代付的 Gas 總額約 1,488 萬美元企業真的願意出錢替使用者付手續費

(以上數字取自 BundleBear 的 ERC-4337 Overview 與 EIP-7702 Overview 兩個公開儀表板[7][8],會隨時間變動,此處標明讀取日期為 2026 年 10 月 13 日。)

帳戶抽象已經是主流基礎建設,但這不代表它沒有代價。兩個誠實的提醒留給你。第一,Bundler 有集中化風險:雖然協議上任何人都能當 Bundler,實務上絕大多數的量集中在少數幾家服務商手上;若這些服務商停擺或選擇審查,使用者的操作會被卡住[1]。第二,能力就是攻擊面:帳戶抽象讓「一筆簽名可以做很多事」,而 2025 年 8 月就出現了攻擊者利用 EIP-7702 把多個惡意動作打包成一筆簽名的案例,兩件合計造成 254 萬美元損失[9]。這正好接到下一節。

🤔 課堂互動:假設你要幫家裡的長輩設計一個「不會被詐騙的錢包」。帳戶抽象給你三種武器:① 每日轉帳上限 ② 白名單地址(只能轉給這幾個人)③ 社交恢復(你和其他家人可以一起恢復)。請寫下你的設計,並說明為什麼這三條規則寫在「錢包合約」裡,會比寫在「App 介面」裡有效。這題沒有標準答案,但你的答案會決定你在 5.5 活動裡的判斷速度。
到這裡為止,我們學的都是「怎麼把門做得更好」。但 5.1 的 Bybit 案告訴我們:門沒被撬開,錢還是被搬走了。現在要把鏡頭轉向真正的犯罪現場——看看攻擊者不碰你的鎖,是怎麼把錢拿走的。這一節是本週份量最重的一節,也是最實用的一節。

5.4 資安現場 — 三種把錢拿走的方法

這一節要教一件很具體的技能:分辨三種「把錢拿走」的路徑。它們的共同點是不需要破解密碼學;它們的差別在於「必須配合攻擊者做什麼動作」。請先把這張總表看過一遍,後面三小節逐一拆解。

先預告一個最容易被搞混的地方:A 類與 B 類在畫面上幾乎一模一樣。你看到的都是一個錢包彈窗、按鈕都寫著「簽署」,感覺都是「按下確認就送出」。但代價完全不同——A 類送出的是一筆要付 Gas 的鏈上交易,手續費由你付;B 類送出的只是一組不上鏈的結構化資料,它要等到攻擊者自己付 Gas 把它送上鏈的那一刻才會生效。差別不在你按了什麼,而在你簽下的東西是什麼。

路徑你會做的動作要不要付 Gas事後補救?代表性大額案(金額見下方)
A. 授權類
(簽一筆鏈上交易)
簽 approve 把額度給出去;或被誘導簽一筆看起來像「確認」的轉帳 要(你付) 授權可在被動用前撤銷;轉帳則不可能 5 件、共 1,049 萬美元
(approve/increaseApproval 3 件 562 萬 + transfer 2 件 487 萬)
B. 簽名類
(簽一組鏈下資料)
在彈出視窗上按「簽署」——不上鏈、不付 Gas,但效力相同 不用(攻擊者付) 幾乎來不及 6 件、共 1,249 萬美元
(Permit/Permit2 3 件 872 萬,占大額損失 38%;setApprovalForAll 1 件 123 萬;EIP-7702 批次 2 件 254 萬)
C. 盲簽與前端劫持
(你相信你看見的畫面)
在硬體錢包上按下確認 看情境 不可能 不在同一統計類別(本表件數與金額只統計 A、B 兩類):Bybit、Radiant 等前端入侵案,手法與金額見第三小節
合計 以上 A、B 兩類,即 ScamSniffer 2025 年全部的大額釣魚案 11 件、共 2,298 萬美元

讀這張表要注意的第一件事是「資料來源」。A、B 兩類的件數與金額都取自 ScamSniffer 的 2025 年度報告,而那份報告的統計範圍只包含「透過釣魚網站」造成的損失;C 類的 Bybit 與 Radiant 是交易所與協議的前端入侵,不在同一份統計裡,把它們並列只是為了讓你比較手法。學會分辨「計算標準」,是我們在這個領域讀任何數字時的第一個動作。這裡的標準是什麼?

一、授權(approve):簽給合約的「提款額度」

第一種路徑最古老也最直觀。以太坊上的代幣(例如 USDC)本身是一份智慧合約,它的原始設計裡有一條規則:你的代幣存放在合約的帳本上,但任何人要動用你的代幣,都必須先取得你的「同意額度」(allowance)。這個「同意」的動作,就叫做 approve。

如果覺得抽象,先想一個你已經很熟的版本:你把某張信用卡的「固定扣款」授權給一個訂閱服務——服務商之後不必再問你一次,就能直接從那張卡扣款。但請注意:信用卡授權有爭議款可以申訴、可以打電話給銀行撤銷。鏈上的 approve 全都都沒有——它沒有到期日,一旦被動用也不可回復。approve 就是這個授權動作,只是它發生在鏈上,對象是一份合約,而「額度」這個參數由你自己填。為什麼要有這個設計?因為去中心化交易所必須代你操作:我們把 USDC 換成 ETH,本質上是「我們把 USDC 給交易所的合約,它把 ETH 給我們」,而合約需要被授權才能從帳戶扣款。所以 approve 不是廠商貪婪的設計,而是必要的機制——問題出在「額度」這個參數怎麼填。

理論上你可以只授權「這一次交易需要的金額」,例如 100 USDC。但每次交易都必須先簽一筆 approve、付一次手續費及等一次確認,體驗很差。於是絕大多數去中心化應用程式的介面,都直接請你授權「無限大」(unlimited,一個 2 的 256 次方減一的數字),一次授權,以後都不用再簽。省下的是手續費與時間,押上去的是我們這個代幣的全部餘額,而且是永久有效的[12]。

這裡有一個非常容易被忽略的時間差:授權當下我們沒有損失,但損失發生在「未來某一天」。合約正常運作時,那個無限額度就靜靜躺著;但合約一旦被升級成惡意版本、被發現漏洞,或那個網站從第一天就是偽造的,攻擊者就能用我們三年前簽下的那一筆授權,把現在的餘額一次搬空——而且不需要再按任何一下送出[12]。2025 年金額超過 100 萬美元的釣魚案一共有 11 件;其中 5 件屬於 A 類,approve 與 increaseApproval 類型 3 件合計 562 萬美元,另外 2 件則是被誘導直接簽下一筆轉帳(transfer),合計 487 萬美元[9]。也就是說,即使整個產業都在談新型的簽名詐騙,最古老的 approve 與轉帳依然年年佔據大額案名單。

二、簽名(Permit/Permit2/setApprovalForAll):不付手續費的同意書

第二種路徑是最危險的一種,因為它完全違反直覺。它建立在 5.2 學到的那個伏筆上:簽章可以不上鏈,不付手續費。

事情的起點是「授權要付手續費」這件事很煩。於是以太坊社群提出了 EIP-2612(permit 擴充),把授權從「鏈上交易」搬到「鏈下簽名」:我們不再需要發一筆 approve 交易,只要簽一組結構化資料,內容包含對象(spender)、金額(value)和期限(deadline),而合約看到這組簽名後會直接認帳[4]。Uniswap 進一步做了 Permit2,把這個機制一般化,讓所有代幣都能用同一套流程[3]。而錢包之所以能顯示出一張「看得懂的表格」讓你確認,靠的是另一份標準 EIP-712(結構化資料簽名),它定義了這些欄位要怎麼呈現給人類看——這份 2017 年提出的呈現標準,後來被 Permit 與 Permit2 沿用,並不是另外發明的表格[3]。總結來說,Permit 是「要求新代幣出廠時自帶簽名授權功能」的官方規格;而 Permit2 是 Uniswap 為了「讓舊代幣也能享有簽名授權體驗」,硬生生架出來的一個第三方基礎建設。

這整套設計在體驗上是巨大的進步:不用付手續費,不用等確認,交易流程從兩筆變一筆。但代價是把風險高度集中到「簽名」這個動作上——因為只要簽名了,攻擊者自己付手續費把這組簽名送上鏈,就能在一筆交易之內把你的代幣全部搬走[12]。

這裡是這一節最重要的一句話:「我只是按了個確認,又沒按送出」——因為這句話很昂貴。簽名不會跳出一筆交易,不會扣手續費,也不會感覺到「我正在付錢」;它只是請你確認一張表格。但它在鏈上的效力,和一筆轉帳完全一樣。

數字說得很清楚。2025 年金額超過 100 萬美元的案例中,Permit 與 Permit2 類型占了大額損失的 38%(3 件、872 萬美元);而全年最大的一筆單一釣魚案,就是 9 月的一筆 Permit 簽名,損失 650 萬美元[9]。另外還有一類必須認識的變形:setApprovalForAll,它不是授權某個代幣的額度,而是「把你名下整個系列的 NFT 全部授權出去」——2025 年 7 月有一件就是這樣被拿走 123 萬美元的 Uniswap V3 部位[9]。

三、盲簽與前端劫持:連專業團隊都會輸

第三種路徑最難防,因為它不需要你做錯任何事——它攻擊的是「你接收到的畫面」。這一小節的第一個案子,我在 5.2 已經提過一次,現在把它完整拆開。

Radiant Capital(2024 年 10 月,超過 5,000 萬美元)。Radiant 是一個跨鏈借貸協議,他們對資金的管理並不馬虎:採用 3-of-11 的多重簽名機制(十一把鑰匙中任意三把同意才能動用資金),而且簽名者使用的是硬體錢包。聽起來這應該是教科書等級的安全配置。但攻擊者先用惡意程式感染了簽名者的電腦,然後做了一件事:讓名為 Safe 的多簽錢包的前端顯示「正常的交易內容」,而實際送到硬體錢包裡等待簽名的,是另一筆惡意交易。團隊在事前還用模擬工具檢視過,仍然沒有發現問題——因為他們按下確認時,靠的是「盲簽」(blind signing):硬體錢包的小螢幕只顯示一團看不清的資料,使用者只能選擇相信電腦上顯示的那個畫面[11]。

事後 Radiant 自己的檢討報告寫得很直白:關鍵交易不應使用盲簽;若真的無法避免,也必須有另一層獨立於電腦之外的驗證方式[11]。這句話之所以重要,是因為它推翻了我們最常見的一種想像——「我用了冷錢包就安全了」。冷錢包保證的是「私鑰沒被偷走」;它不保證「簽下的東西是我們以為的東西」。

這個攻擊手法的極大化版本,就是本週開場的 Bybit:同樣是入侵開發環境,同樣是在前端注入惡意 JavaScript,同樣是讓簽署畫面顯示合法交易。差別在於規模——15 億美元,約當 ScamSniffer 統計的 2025 年全年簽名釣魚總損失(8,385 萬美元)的 17 倍[9][10]。

而第三種路徑最新的變形,正是 5.3 提到的副作用被拿來利用:EIP-7702 於 2025 年 5 月隨 Pectra 上線後,攻擊者很快發展出「一筆簽名打包多個惡意動作」的手法。過去一個簽名只能授權一件事,現在一個簽名可以同時完成好幾件事——包含「把你的帳戶委託給一份惡意合約」。2025 年 8 月出現的兩件案例,合計損失 254 萬美元[9]。這件事的意義是:協議的每一次升級,都會被攻擊者在幾個月內測試完畢;我們不可能靠「等技術成熟」來保護自己,只能靠理解機制。

四、2025 年的全景:數字說了什麼

上面三種路徑的整體趨勢看,會得到比單一案例更有用的判斷。以下數據都來自 ScamSniffer 的 2025 年度報告[9]:

指標2023 年2024 年2025 年
全年損失2.95 億美元4.94 億美元8,385 萬美元
受害人數約 324,000 人約 332,000 人約 106,106 人
平均每人損失910 美元1,488 美元790 美元
最大單筆2,405 萬美元5,548 萬美元650 萬美元(Permit 簽名)
超過 100 萬美元的案件數13 件30 件11 件

三個判讀。第一,損失金額大幅下降,但這不代表威脅消失。報告特別指出,釣魚活動與市場活躍度同步:2025 年第三季(正好是以太幣全年最強的一波漲勢)損失高達 3,104 萬美元,是全年最高的一季;最低的 12 月只有 204 萬美元。報告的原話是——「釣魚是使用者活躍度的機率函數」[9]。意思不是「行情好就會被騙」,而是:你越活躍、越常簽名,就越該在按下確認之前停三秒。

第二,攻擊者正在從「大額單筆」轉向「低金額、高頻率」。超過 100 萬美元的案件從 2024 年的 30 件降到 2025 年的 11 件;平均每人損失降到 790 美元[9]。這代表一件事:自保不是有錢人的事,而是每一個持有錢包的人的事。你不是因為資產多才被盯上,而是因為「有在簽名」而被隨機到。

第三,報告的方法論本身也值得學:它明確標示只統計「透過釣魚網站」造成的錢包清空損失,不含交易所被駭、私鑰洩漏、合約漏洞等其他類型[9]。這是一個負責任的統計應有的樣子——以後看到任何「加密貨幣犯罪損失多少億」的新聞,都應該先問一句:這份數字包含的範圍是什麼?把不同口徑的數字相加,是這個領域最常見的錯誤引用。

那要怎麼自保?把本節學到的東西收成四條可以立刻執行的規則:① 定期做授權健檢——用 Revoke.cash 這類工具查看你的地址對哪些合約簽過授權,把不認得的、額度無限的、已經不用的撤銷掉[13]。② 簽名前看四個欄位:對象(spender / to)、金額(value / amount)、期限(deadline)、以及簽名的來源網域(domain)。③ 不要盲簽——如果硬體錢包上的內容你看不懂,就不要按確認;把它當成「這筆交易有問題」的預設值。④ 帳戶分層——把「日常互動用的零錢包」和「存放長期資產的錢包」分開,讓一次失手的最大代價被限制住。

🤔 課堂互動(預習 5.5):想一想你或家人手機裡的通知——「您的帳戶安全驗證異常,請點此確認」。把那段訊息的三個話術寫下來(例如:製造急迫、假裝官方、要求你「確認」而不是「付錢」)。5.5 的分組活動,我們會用同樣的手法去讀一張真正的區塊鏈簽名請求——差別只在你這次看得到原始欄位。
三條路徑講完,你手上已經有判斷的依據了。接下來換你們上場:5.5 要分組做兩件事——先用真欄位鑑識三張簽名單,再打開授權清單,看看一個真實的地址被授權了多少東西。

5.5 全班分組活動 — 簽名鑑識庭

這一節沒有新理論。前四節你已經拿到了判斷的所有材料——單向推導、簽章的鏈下效力、授權的參數、盲簽的風險——現在要做的是把它變成肌肉記憶。今天我們試著分組,而且會用一個和平常不太一樣的方式分組:你們這一組,本身就是一把助記詞。

分組:掃碼領卡(約 2 分鐘)

請掃描投影片上的 QR code,在網頁上輸入學號,領取你的卡片。規則如下:

這裡要先解掉一個你可能已經發現的矛盾。5.2 的資安鐵則是「任何要你輸入助記詞的網頁都是詐騙」,而我們現在卻要你把 12 個詞輸進一個網頁。分辨的關鍵在三件事:① 這一組助記詞是課堂當場產生的示範字串,背後沒有任何真實資產;② 你輸入的那個網址是老師在投影片上明示的驗證器,不是任何人私訊給你的連結;③ 真實世界的原則完全不變——凡是「要你輸入會動到真資產的助記詞」的網頁、客服或表單,無論理由多合理,一概是詐騙。三個條件缺任何一個,就不要輸入。活動結束後,請把畫面收掉,不要把那一組詞留在手機截圖裡當紀念。

關卡一:「這張簽名單,你敢簽嗎?」(10 分鐘)

每一組會拿到三張簽名請求,一張是正常的交易授權,一張是惡意的無限額授權,一張是範圍更大的「整批授權」。你們的任務有三個:

  1. 判斷哪一張是惡意的,並說出你判斷的依據。
  2. 指出最致命的那一個欄位——是對象(spender)、金額(value)、期限(deadline),還是來源網域(domain)?
  3. 寫下一個句子:如果你當時只花三秒,你會看哪一個欄位?

這裡先給你們一個閱讀簽名請求的方法。EIP-712 的結構化資料在錢包裡會呈現成類似這樣的表格(這是一個示範,不是真實案例):

Permit2 · Token Approval
對象(spender):0x7a25...3F9c
金額(value):Unlimited | 期限(deadline):無
來源網域(domain):uni-swap-airdrop[.]xyz

錢包跳出的簽名請求(示範格式)

看出來了嗎?這張表上有三個線索:金額寫著「無限」、期限沒填、而來源網域是一個長得像 Uniswap 但不是 Uniswap 的網址。你們在關卡一要做的事,就是把這種「三秒內看得出來」的破口找出來——因為真實世界的詐騙,絕大多數不是設計得多精巧,而是設計得足夠多話術、足夠趕時間,讓你不看那三行。

公布判準(請先完成小組判斷並寫下依據,再展開)

★ 誠信規則:全組完成判斷、把依據寫在回報單上之後再展開。先展開的組,本關的判斷不予計分。

簽名單判定致命欄位與對應機制
第一張:正常的 Swap Permit可簽對象是熟悉的交換合約、金額有限、有期限。這一張的重點不是「安全」,而是讓你看到正常的 Permit 長什麼樣——沒有 Unlimited,deadline 有填。
第二張:無限額 Permit2惡意金額寫著 Unlimited、期限空白,來源網域是仿冒的。對應 5.4 第二小節的簽名類路徑:你不上鏈、不付 Gas,但攻擊者會拿這組簽名自己送上鏈,在一筆交易內搬空你的代幣。
第三張:setApprovalForAll惡意授權的是「一整個系列」而不是「一個金額」——這是最容易被忽略的一種,因為它不寫數字,往往只看到「approve」就按下去。對應 5.4 第二小節提到的整批授權變形(2025 年 7 月那筆 123 萬美元的 Uniswap V3 部位就是這樣被拿走的)。

最重要的一句:今天這三張是「教科書情境」——我們看得到欄位、可以慢慢比對。真實世界的原則是 5.4 的第三條:看不懂就不要按確認。能讀懂欄位是本事;願意在讀不懂的時候停手,才是保命。

關卡二:「授權健檢」(10 分鐘)

關卡二把鏡頭轉回我們自己。這一關不需要事先準備任何錢包——查授權清單是唯讀的動作,貼上地址就能看,不必連錢包,也不必簽任何東西。三條路,自己選一條:

不論走哪一條路,要讀的東西都一樣:

  1. 讀清單:第一件事是先確認你看的是哪一條鏈——免費版一次只顯示一條鏈(預設是 Ethereum 主網)。如果你的授權是在 BSC、Polygon、Base 這些鏈上,要切到那條鏈才看得見。確認鏈之後再讀:這個地址對哪些合約簽過授權?金額是「無限」還是有限?授權是多久以前簽的?
  2. 找風險:有沒有你完全認不得的合約?有沒有早就沒在用的服務,卻還留著無限額度?

為什麼這件事要動手做?因為「授權」這個概念在腦子裡是抽象的,但在畫面上是一份清單。當我們看到一份真實的清單上面掛著十幾筆授權、其中三筆寫著無限大、日期是三年前——這個畫面的說服力,比我在 5.4 寫的十個段落加起來都強。而且這個動作可以帶回家做:你們真正的錢包同樣可以用同一個工具檢查。

回報與解讀(約 12 分鐘)

時間到之前,每一組請交回一份回報單(線上表單,每組一筆),內容包含:關卡一判斷的結果與最致命欄位、關卡二記錄到幾個無限額授權、以及一句話——今天學到最有用的一條自保守則。接著我們一起做三個層次的解讀:

  1. 簽名是一種同意,不是一種動能。它不需要你「送出」什麼,你只要表示同意,鏈上就會有人替你完成剩下的所有動作。這是 5.2 那句「簽章不等於交易」的實務結論。
  2. 授權是有參數的。對象、額度、期限——沒有參數概念的「同意」,等於一張空白支票。你們在關卡一看到的「Unlimited + 無期限」,就是把支票金額欄留空。
  3. 每一次簽名前的三秒,要花在固定的地方。不是花在「這個網站看起來很專業」,而是花在「金額與對象」這兩欄。這是可以練成反射動作的。

最後一個追問(口頭回答,不用寫):如果這三張簽名單不是出現在電腦螢幕上,而是出現在硬體錢包那個小小的黑白螢幕上——你還看得到「Unlimited」這四個字嗎?你只會看到一長串看不懂的十六進位數字。這就是 5.4 第三小節講的盲簽,也是為什麼「用了硬體錢包就安全了」這句話只對了一半:硬體錢包保護的是你的私鑰,不是你的判斷。

🤔 課堂互動(分組收尾,3 分鐘):請每組派出一個人,用一句話說出你們覺得最違反直覺的發現。我特別期待聽到這三種答案之一:① 「原來不用付手續費的簽名更危險」② 「原來授權是永久有效的」③ 「原來少一個人的助記詞就不是同一把鑰匙」。這三句話,就是本週全部的重點。
活動結束。今天你們做了一件很多「大人」沒做過的事:親手讀過一張簽名請求的欄位,也親眼看過一筆授權。最後一節,我們把整週收成一張表、一句話,以及三題回家作業。

5.6 本週總結+課後任務

本週總結:從一把鑰匙到一個可編程的帳戶

階段你學到什麼最該記住的一句
鑰匙的物理學(5.2)私鑰、公鑰、地址的單向推導;簽章與交易的差別;助記詞與 HD 錢包;冷熱錢包光譜私鑰不會被算出來,只會被拿走;而簽章不上鏈也能致命
帳戶正在被改寫(5.3)EOA 的限制;ERC-4337 的 UserOperation/Bundler/EntryPoint;EIP-7702 的委託式升級;2026 年的實測規模把「誰付費、什麼算有效簽章、一筆交易做幾件事」解耦,就是帳戶抽象
三種把錢拿走的方法(5.4)授權(approve)、簽名(Permit/Permit2)、盲簽與前端劫持;以及 2025 年的整體數據「我只是按了個確認,又沒按送出」——這是最貴的一句話
實作(5.5)分組=一把助記詞;簽名鑑識;授權健檢與撤銷簽名前那三秒,要花在「金額與對象」上

如果只能帶走一句話,是這句:在 Web3,你不是在管理密碼,而是在管理授權——每一次簽名,都是一次同意。上一週你學的是「錢怎麼流」;這一週你學的是「錢會被誰拿走」。而答案出乎意料地簡單:不是被破解,是被你自己同意的。這句話聽起來像是在責備使用者,但它的真正意義是——這也代表你握有全部的防守權。你不需要相信任何平台、不需要等監管、不需要靠誰來保護你;你只需要在每一次按下確認之前,看懂那三行字。

📅 下週預告(10/23 第 6 週)

第 6 週的主題是專案發想與智慧合約設計思維:我們要把 3.6 的五問檢核表,加上這一週的資安視角,一起用在你們自己的專案構想上——你要開始想「我的專案需要哪些簽名、需要哪些授權、哪一步最脆弱」。

請帶著兩樣東西回來:① 3.6 的五問檢核表(前一次上課已寫過一次初稿);② 這一週你對「簽名」的理解。下週之後,第 8 週就要進開發環境、真的開始寫智慧合約了。

課後任務

  1. 用自己的話寫出四者關係(150 字以內):私鑰、公鑰、地址、助記詞,誰推導出誰、誰可以公開、誰絕對不能外流。這一題是基本功,下週之後每一次寫合約、部署、測試都會用到。
  2. 盤點你手機上的授權(約 200 字):挑三個你常用的 App 或服務(例如 Google 帳號的第三方應用授權、外送平台的付款授權、社群平台的連動),列出它們各自拿到你什麼權限、你什麼時候同意的。然後寫下它和 Web3 的 approve 有什麼相同、有什麼不同——這一題沒有標準答案,但它是你未來設計任何系統時的第一課。

提交方式:以上二題請寫進本週的開發日誌,於 10/20前在 iClass 提交。開發日誌是教學計畫表明定的每週作業,也是平時評量的主要依據——請照平常的格式寫。