安全分析 · Security Analysis

Meshtastic
節點污染攻擊解析

深入了解節點污染(Node Poisoning)的攻擊原理、影響範圍,以及如何保護你的 Mesh 網路節點。基於 DEF CON 2025 公開揭露資料整理。

DEF CON 2025 Meshtastic 安全 LoRa Mesh 網路

NodeDB 是什麼?它在 Meshtastic 中扮演什麼角色?

要理解節點污染攻擊,必須先知道 NodeDB 是什麼。NodeDB(Node Database)是每台 Meshtastic 裝置在本地端維護的一份「通訊錄」,記錄它所看過的所有鄰近節點資訊。

NodeDB 儲存哪些資料?

每當裝置收到某個節點廣播的 NodeInfo 封包,就會把該節點的完整資訊存入 NodeDB:

NodeDB 中每筆節點記錄的欄位
num(Node Number) 節點的唯一識別編號,由硬體 ID 衍生,全球唯一 身份識別
long_name 長顯示名稱,如「Alice @ Taipei」,顯示於 App 聯絡人列表 可被偽造
short_name 四字元短名,顯示於裝置 OLED 螢幕上 可被偽造
hw_model 硬體型號,如 HELTEC_V3、TBEAM 等 可被偽造
public_key 節點的 ECC 公鑰,用於私訊加密與身份綁定 初次記錄後受保護
last_heard 最後一次收到該節點封包的時間戳記 淘汰依據
snr / rssi 訊號品質指標,用於路由決策 路由參考
position 最後已知 GPS 座標,若對方有開啟位置廣播 可被偽造
is_favorite 是否被標記為最愛,影響淘汰優先順序 關鍵防護欄位

NodeDB 在裝置運作中的四個核心功能

① 顯示聯絡人列表
App 上的節點清單、名稱、距離、最後上線時間,全部來自 NodeDB。你看到的「Alice」正是 NodeDB 記錄的 long_name 欄位。
② 驅動 Mesh 路由
封包在 Mesh 網路中如何跳轉,取決於各節點的 NodeDB 對網路拓撲的認知。SNR 與 last_heard 是路由演算法的重要輸入。
③ 私訊加密的基礎
傳送 DM 前,韌體從 NodeDB 取出對方的 public_key 來加密訊息。NodeDB 裡的公鑰正不正確,直接決定 DM 能不能被正確解密。
④ 地圖與位置顯示
App 地圖上顯示的其他節點位置,來自 NodeDB 儲存的 position 欄位。偽造的 GPS 座標可以讓節點在地圖上「出現在錯誤的位置」。

NodeDB 的生命週期:節點記錄如何進出

NodeDB 的容量有限,記錄不斷地被新增、更新、淘汰,這個循環正是節點污染攻擊得以運作的關鍵:

一筆節點記錄的完整生命週期
新增
首次收到該節點的 NodeInfo,以 Trust on First Use(ToFU)信任並寫入
更新
再次收到同一 Node Number 的封包,更新 last_heard 與部分欄位
靜止
長時間未收到該節點訊號,last_heard 逐漸老化
淘汰
NodeDB 滿時,最舊且非 Favorite 的記錄被踢出
漏洞點
被踢出後,下次收到同 Node Number 的封包視同初次見面

淘汰的判斷依據:三層優先序

NodeDB 滿時並非隨機踢人,韌體依照固定優先序掃描所有記錄,找出「最應該被淘汰的那一筆」:

淘汰優先序(由高到低)
is_favorite = true → 永不淘汰
標記為 Favorite 的節點在淘汰掃描時直接跳過,無論 NodeDB 多滿都不會被踢出。這是目前最可靠的防護機制。
via_mqtt = true → 優先被踢
透過 MQTT 橋接進來的節點(非直接 LoRa 聽到)被視為可信度較低的資訊,比起 LoRa 直接聽到的節點更優先被淘汰。
last_heard 最舊 → 在同等條件下先出去
排除 Favorite 與 MQTT 節點後,最久沒有收到訊號的節點(last_heard 最小值)就是淘汰對象。攻擊者密集廣播大量新節點,可以讓 NodeDB 快速填滿,使真實節點的 last_heard 相對老化而被踢出。
對攻擊分析的補充含義
「最舊的先被踢」只是簡化說法。更精確的是:最久沒被 LoRa 直接聽到、且未標記 Favorite 的節點優先被淘汰。若目標節點是透過 MQTT 橋接進來的,它本來就是第一個被踢的候選;若目標節點剛廣播過(last_heard 很新),攻擊者需要填滿更多假節點才能把它排擠出去。

Meshtastic 有兩份 NodeDB,分別在不同地方,扮演不同的防護角色:

韌體端(裝置本身)
  • 執行時由 Flash 載入 RAM 操作,上限約 100 筆(受 RAM 容量限制,依 MCU 而異)
  • 定期或關機時批次寫入 Flash 持久化(收到封包不立刻寫 Flash)
  • 重開機後從 Flash 還原(非揮發性)
  • Favorite 節點永不淘汰
  • NodeDB 滿時自動依三層優先序淘汰記錄
  • 這是節點污染攻擊的目標
App 端(手機)
  • 儲存於手機應用程式內
  • 無筆數限制,可記錄所有看過的節點
  • 不會因為裝置端淘汰而消失
  • 公鑰變更時顯示紅色警示
  • 提供額外一層身份驗證防護
  • 是目前最強的防污染偵測機制
RAM 與 Flash 的分工
裝置運行時,NodeDB 在 RAM 中讀寫操作——筆數上限由 RAM 容量決定。韌體採延遲批次策略:收到封包先更新 RAM,累積後定期或於關機前統一寫入 Flash。若裝置在寫入前突然斷電,該段期間的變更會遺失,下次開機從上次成功寫入的狀態恢復。
為什麼 App 端的 NodeDB 更安全?
手機 App 儲存的 NodeDB 沒有容量限制,不會執行淘汰機制,所以攻擊者無法透過「洗掉記錄再頂替」的方式污染 App 端。此外,App 端會對比收到的新 NodeInfo 與已記錄的 public_key,一旦發現公鑰不符就顯示紅色警示。這也是為什麼連接手機 App 比單獨使用裝置螢幕更安全

節點污染的三個肇因

節點污染並非單一漏洞造成,而是三個設計特性同時成立時才會發生。理解這三點,是掌握防禦策略的前提。

① Trust on First Use(ToFU):信任首次見面

Meshtastic 是去中心化網路,沒有中央身份認證伺服器。節點第一次收到某個對端的 NodeInfo 封包時,直接信任其內容並存入本地節點資料庫(NodeDB)。這個設計讓網路能夠自動擴展,但也意味著任何人都可以聲稱自己是任何節點。

② NodeDB 記憶體上限約 100 筆

嵌入式裝置的 RAM 有限,NodeDB 能同時記錄的節點數因 MCU 而異(一般約 80~100 筆)。當有新節點加入且 NodeDB 已滿,最舊的節點記錄會被淘汰。一旦某個節點被淘汰,下次收到「聲稱是它」的封包,就等同初次見面,會再次被無條件信任。

正常狀態(NodeDB 未滿)
合法節點 × 40
空餘空間
攻擊中(大量假節點湧入)
合法
假節點 × 80(攻擊者製造)
被踢出

③ 攻擊者持有頻道 PSK

PSK(Pre-Shared Key)是頻道的共用加密鑰匙。持有 PSK 的人可以解密頻道上所有封包,也可以製造出格式完全合法的假封包。公開頻道的 PSK 人人可得,Default Channel(LongFast)的 PSK 值甚至直接寫在 Meshtastic 公開原始碼中。

關鍵結論
三個條件同時成立時:攻擊者可以讓目標裝置「忘記」合法節點,再用假封包頂替其位置,達到污染效果。

攻擊的完整流程

節點污染攻擊的技術門檻遠低於一般預期——攻擊者只需要一台 Meshtastic 裝置(或能廣播 LoRa 封包的工具)以及頻道 PSK,便可執行以下步驟:

STEP 01
加入頻道
蒐集成員 Node Number
STEP 02
密集廣播
100+ 個假節點
STEP 03
目標節點
被踢出 NodeDB
STEP 04
注入偽造
NodeInfo 封包
STEP 05
假資訊散播
至所有成員裝置

偽造封包的內容比較

以下展示合法 NodeInfo 封包與攻擊者偽造封包的對比。兩者的格式完全相同,接收方裝置在沒有簽名驗證的情況下無從辨別。

小美本人發送  ✓ 真實
Node Number#B3C4D5
Long Name"小美 @ 板橋"
Short Name"XMEI"
Public Key0x9e2f…a847
PSK 驗證✓ 通過
攻擊者偽造  ✗ 假冒
Node Number#B3C4D5
Long Name"小美 [污染版]"
Short Name"FAKE"
Public Key0x9e2f…a847
PSK 驗證✓ 也通過(同一把鑰匙)
為何無法區分?
PSK 是對稱加密——持有 PSK 的人都能加密也能解密。兩個封包對接收方來說格式完全一樣,沒有任何機制可以證明「這真的是小美發的」。

污染過程的完整圖解

以下五張圖依序呈現從正常狀態到污染完成的每個關鍵階段,綠色代表正常節點、紅色代表遭污染或假冒、藍色代表 Favorite 受保護節點。

階段一:正常狀態
小美的裝置 Long Name: 小美 @ 板橋 Short Name: XMEI HW: HELTEC_V3 Position: 25.01N 121.45E Public Key: 0x9e2f…a847 PSK 加密廣播 NodeInfo ToFU 信任 小明的 NodeDB(3/100) 小美 @ 板橋 #B3C4D5 · 0x9e2f…a847 志明 @ 新店 #D5E6F7 基地節點 (★ Favorite) #A1F2B3 · 永不淘汰 空位 × 97 NodeDB 尚有餘裕 健康狀態,資料完整可信
階段二:直接覆蓋失敗
攻擊者的裝置 Node Number: #B3C4D5 Long Name: 小美[污染版] Short Name: FAKE Position: 22.99N 120.21E Public Key: 0x9e2f…a847 PSK 驗證也通過 假 NodeInfo 已有記錄 → 拒絕 小明的 NodeDB(3/100) 小美 @ 板橋 ← 保護中 #B3C4D5 已存在,拒覆蓋 志明 @ 新店 #D5E6F7 基地節點 (★ Favorite) #A1F2B3 · 永不淘汰 空位 × 97 舊記錄保護:直接覆蓋失敗
階段三:洗爆 NodeDB
攻擊者密集廣播 假節點 #RAND01 假節點 #RAND02 假節點 #RAND03 假節點 #RAND97 共 97 個假節點 PSK 驗證全通過 目標:塞滿 NodeDB 小明的 NodeDB(100/100) 小美 @ 板橋 — 已淘汰 假節點 #RAND01 寫入 NodeDB 假節點 #RAND02 ~ 97 × 96 筆,填滿 NodeDB 基地節點 (★ Favorite) Favorite 保護,未被淘汰 志明 @ 新店 #D5E6F7 · 仍存在 NodeDB 塞滿,小美記錄消失
階段四:注入偽造封包,污染完成
攻擊者注入假封包 Node Number: #B3C4D5 Long Name: 小美[污染版] Position: 22.99N 120.21E Public Key: 0x9e2f…a847 ToFU: 初次見面 → 信任 NodeDB 已無 #B3C4D5 偽造封包 寫入成功 小明的 NodeDB(100/100) 小美 [污染版] ← 新寫入 #B3C4D5 · 假資訊 · 污染 假節點 #RAND01~97 × 97 筆假記錄 基地節點 (★ Favorite) 未受影響 志明 @ 新店 仍正常 污染完成,假資料已寫入
階段五:結果對比與 Favorite 防禦
小美節點(已污染) 名稱 → 小美[污染版] 位置 → 台南(假) HW → TBEAM(假) Public Key → 正確(不變) 基地節點(防禦成功) Favorite → 永不淘汰 已有記錄 → ToFU 不觸發 注入失敗,記錄完整 小明裝置看到的畫面 小美 [污染版] 位置:台南 · HW:TBEAM · 名稱:假 App 警示:Public Key 不符 → 紅色 志明 @ 新店 正常顯示 基地節點 (★ Favorite) 正常顯示,攻擊無效 假節點 × 97 佔滿 NodeDB 剩餘空間 小美已污染;Favorite 節點安全

PSK 加密的本質:不是你想的「保密」

很多使用者誤以為「有加密就安全」,但 Meshtastic 頻道的 PSK 加密,設計目的是頻道隔離,而非內容隱私保護。

加密類型 誰能讀取內容 誰能偽造封包 適用目的
Default Channel
PSK = 0x01(公開)
全世界任何人 全世界任何人 公開廣播
自訂私有頻道
自訂 PSK
所有持有 PSK 的成員 所有持有 PSK 的成員 頻道隔離
私訊 DM
非對稱加密
僅目標接收方 理論上不可能(需私鑰) 端對端加密
實務建議
把 Meshtastic 公開頻道視同對講機或無線電廣播——頻道內的所有人都聽得到你的名字、硬體型號、GPS 位置。不要在 Long Name 或 Short Name 中放入任何你不希望陌生人知道的個人識別資訊。

NodeInfo 各欄位的保護狀態

NodeInfo 封包欄位分析
Long Name可被偽造 — 攻擊主要目標
Short Name可被偽造
Hardware Model可被偽造
GPS 座標可被偽造(位置欺騙)
Public Key受 NodeDB 保護,初次記錄後不可覆蓋
私鑰永不廣播,永不離開裝置
私訊 DM 內容AES-CCM 加密,無私鑰不可解

影響範圍:能做什麼、做不到什麼

節點污染攻擊並非萬能。清楚了解攻擊的邊界,有助於正確評估風險等級。

竄改他人節點的顯示名稱
所有成員裝置上都會顯示假名稱,直到受害節點重新廣播正確 NodeInfo 或重開機。DEF CON 展示中節點名稱被改為忍者 emoji(🥷)。
在公開頻道假冒他人發訊息
PSK 頻道目前缺乏訊息來源驗證(Message Signing),攻擊者可以廣播聲稱來自任何人的頻道訊息。
污染節點自身的顯示(已修補)
使用自身 Node Number 的偽造封包,過去可以讓你的裝置螢幕也顯示假名稱。此漏洞已於 DEF CON 後發布的韌體修補,重開機即可恢復。
無法竄改 Public Key
Public Key 一旦進入 NodeDB 就受到保護,後續相同 Node Number 的封包無法覆蓋公鑰欄位。
無法解密私訊(DM)
DM 使用接收方公鑰加密(AES-CCM),沒有接收方私鑰就無法解密。即使攻擊者完全掌控頻道,也看不到私訊內容。
無法取得或偽造私鑰
私鑰永遠不離開裝置,不會透過任何頻道廣播或傳遞。

節點污染攻擊的過程及影響

節點污染攻擊從發動到完成,每個階段都會產生不同的影響。有些影響在攻擊「進行中」就已發生,不需要等污染成功——嚴重程度完全取決於使用場景——點選各路徑查看詳細說明。

A
社交工程:假冒身份發出指令
高風險

攻擊者把信任節點(群組管理員、協調者)的名字改成自己控制的內容,再以那個身份在頻道上發出指令。因為顯示名稱看起來是那個人,成員很可能照做。

01
管理員節點名稱被竄改
所有成員裝置看到的名稱,已是攻擊者設定的假名。若攻擊者使用相近的名稱(如加一個空格或相似字),不易察覺。
02
假冒管理員在頻道發令
「大家換頻道,掃這個新 QR Code」、「PSK 更新了請重新加入」。PSK 頻道目前無訊息簽名,無法驗證訊息真正來自誰。
03
成員被騙,主動交出私密頻道資訊
照著假指令掃 QR Code,結果把私有頻道的 PSK 提交給攻擊者控制的節點。
04
攻擊者取得私有頻道 PSK,進一步滲透
拿到 PSK 後,攻擊者可讀取該頻道所有封包內容,並對任意節點發動下一輪更精準的污染攻擊。
防範重點
頻道 PSK 的變更,務必透過帶外管道(面對面 QR Code)確認,而非相信頻道上的文字指令。
B
路由干擾:偽造 GPS 讓網路拓撲出錯
中風險

NodeInfo 裡的 GPS 座標同樣可被偽造。攻擊者把固定基礎節點或骨幹中繼節點的位置移到幾十公里外,Mesh 路由演算法對網路拓撲的認知就會出錯。

01
基礎節點的 GPS 座標被偽造
對其他節點而言,區域骨幹中繼節點看起來「已移到遠方」,不再是本地網路的中繼點。
02
路由演算法誤判拓撲
封包不再優先透過骨幹中繼節點轉送,可能繞遠路或直接找不到有效路徑而丟棄。
03
區域網路效能下降,訊息送達率降低
對一般聊天影響有限,但在緊急通訊場景中,「訊息沒送到」可能造成嚴重後果。
固定基礎節點特別需要注意
長期架設的固定基礎節點是區域 Mesh 的骨幹。若這些節點的位置資訊被持續污染,路由演算法對網路拓撲的判斷就會系統性出錯,影響整個覆蓋區域的封包傳遞效率。
E
頻道 DoS:攻擊進行中就已封鎖公共通訊資源
攻擊中即發生 / 易被忽略
時序提醒:這個影響不需要等污染成功
洗 NodeDB 的密集廣播在攻擊「進行中」就已造成頻道壅塞。即使攻擊最終失敗,通訊中斷已經發生。本路徑描述的是攻擊手段本身的附帶傷害,而非污染後的後續影響。

LoRa 頻道是共用的公共資源

LoRa 頻段是無線電頻譜的一部分,屬於區域內所有人共用的通訊資源(無線電公地)。它不像私人網路可以設門禁——任何持有相容硬體的人都能在同一段頻率上廣播。攻擊者密集佔用頻道,等同於封鎖了一條公共道路:不論其他人有沒有被「污染」,他們都失去了使用這條路的機會。改變名字影響的是資訊的真實性;佔用頻道剝奪的是所有人通訊的權利。

01
LoRa 頻寬本身極度有限
LoRa SF10 / 125kHz 的實際資料傳輸率僅約 980 bps,一個 NodeInfo 封包約 50–80 bytes。密集發送 100 個封包,光是傳輸時間就超過數十秒,期間頻道幾乎被獨佔。
02
LoRa 無碰撞偵測,封包互相干擾
不像 Wi-Fi 有 CSMA/CA,LoRa 沒有「等待空閒頻道再發送」的機制(Meshtastic 有簡單的退避,但無法阻擋惡意節點)。攻擊者同時廣播時,合法封包大量碰撞、損毀、需重傳,形成雪球效應。
03
區域內所有合法節點的通訊被迫中斷
攻擊期間,所有正常通訊(訊息、位置、Telemetry)都被迫延遲或丟棄。這不只影響受攻擊的目標節點,而是整個覆蓋範圍內的每一個人——共用資源被獨佔,所有人付出代價。
04
消耗節點電力,加速電池耗盡
密集接收大量封包、觸發 NodeDB 寫入與淘汰運算,對電池供電的節點造成額外耗電。長時間攻擊可縮短野外部署節點的續航時間,進一步削弱網路韌性。
LoRa 頻寬 vs 攻擊封包量的數字對比
LoRa SF10 有效傳輸率
~980 bps
125 kHz 頻寬
NodeInfo 封包大小
~50–80 B
含 header overhead
100 封包佔用時間
> 60 秒
頻道近乎完全封鎖
與傳統 DDoS 的關鍵差異
傳統 DDoS 需要大量來源才能癱瘓目標。LoRa 頻道因頻寬極窄且完全開放,單一攻擊節點就足以讓整個覆蓋範圍的 Mesh 通訊陷入停頓。更根本的是,這個問題目前在協定層面幾乎無法防禦——開放廣播是 LoRa 的設計特性,也是公共資源困境的體現:任何人都能使用這條路,也因此任何人都能封鎖它。
C
公鑰邊界情況:DM 加密用錯對象
難偵測

正常情況下公鑰受 NodeDB 保護不可覆蓋。但有一個邊界情況:攻擊者的偽造封包在目標節點「第一次被看見」之前就送達,公鑰寫入就可以成功。

01
觸發條件:新節點初次加入,或 NodeDB 已完全淘汰該記錄
攻擊者在真實節點廣播自己的 NodeInfo 之前,搶先廣播含假公鑰的偽造 NodeInfo。
02
假公鑰被寫入受害節點的 NodeDB
後續真實節點廣播正確公鑰,但 NodeDB 已有記錄,不會再覆蓋。
03
傳給目標的 DM 用錯公鑰加密
訊息送出去了,但對方解不開。發送方和接收方都不知道為什麼——你不知道訊息有沒有被收到,對方收到的是亂碼。
為何最難被發現
表面上一切正常,名稱顯示正確,DM 也能送出——只是默默解不開。需要雙方帶外確認(面對面重新掃 QR Code)才能修復。
D
使用者誤操作:自行清除最後防線
人為風險

App 端的公鑰警示是最後一道防線,但使用者在看到紅色警告後的直覺反應,往往反而讓污染固化。

01
App 顯示紅色公鑰警示
偽造的 NodeInfo 讓 App 偵測到公鑰與記錄不符,顯示警告。這是系統正常運作的防護。
02
使用者選擇「刪除該節點再重新信任」
這是常見的直覺反應——「清掉錯誤的記錄,讓系統重新抓一次」。但此時 NodeDB 裡流通的是攻擊者的假記錄。
03
刪除正確記錄,污染版本成為新基準
App 重新從網路抓取的是攻擊者的假 NodeInfo,假公鑰現在被視為「正確的」。App 的防護完全失效。
正確的處理方式
看到公鑰警示時,不要直接刪除記錄。先透過帶外管道(電話、面對面)向對方確認他的 Node Number 和公鑰是否有變動,再決定是否信任新記錄。

嚴重程度:依使用場景而異

低風險
一般社群使用
名稱被改造成困擾,重開機恢復。DoS 效果短暫,通訊中斷幾分鐘後恢復正常。
中到高風險
活動 / 志工協調
假冒指揮官發令造成協調混亂;DoS 封包風暴讓現場通訊在關鍵時刻中斷,資源誤配風險高。
高風險
緊急通訊 / 災防場景
路由失效+身份假冒+頻道 DoS 三重打擊,在最需要通訊的時刻讓整個 Mesh 失靈。
獨立威脅
單純的 LoRa DoS
即使污染失敗,密集廣播本身就能癱瘓頻道。單一節點即可達成,不需要污染成功,破壞門檻極低。
Meshtastic 官方立場
Meshtastic 從未背書用於敏感或緊急通訊,官方文件明確說明這點。現有設計以社群與休閒使用為主,安全強化(Message Signing)正在進行中。特別要注意的是,頻道 DoS 問題比節點污染更難從協定層面根本防禦——因為 LoRa 的開放廣播特性本身就允許任何持有相容硬體的人發送封包。在根本修補到位之前,緊急通訊場景應搭配其他有身份驗證與頻道保護的系統使用。

污染後如何恢復?

被動等待恢復
  • 自身節點名稱被改 → 重開機即恢復正確資訊
  • 他人節點顯示假名 → 等對方裝置重新廣播正確 NodeInfo
  • 重開機後韌體會重新廣播自身的正確 NodeInfo,鄰近節點會更新記錄
主動清除污染記錄
  • 在 App 中刪除該節點記錄
  • 透過帶外管道確認對方身份後,請對方重新廣播
  • 公鑰邊界情況需面對面重新掃 QR Code 才能完全修復
  • 刪除前務必先確認哪份記錄才是真實的

現在就能做的防禦措施

以下四種方法可以立即執行,大幅降低被節點污染攻擊影響的機率。

01
將重要節點加入 Favorite
Favorite 節點永遠不會被 NodeDB 淘汰,攻擊者無法為其製造偽冒機會。透過互傳 DM 或掃 QR Code 可自動加入 Favorite。
02
注意 App 的紅色公鑰警示
當某節點的 Public Key 突然改變,Android / iOS App 會顯示紅色警告。這是系統在告訴你「這個節點的身份可能被竄改」,不要忽略它。
03
使用私有頻道
自訂 PSK 並透過面對面 QR Code 掃描分發給信任的人。避免使用 Default Channel(LongFast),其 PSK 為公開常數,等同明碼。
04
透過 DM 交換聯絡資訊
與重要聯絡人互傳私訊,確認對方公鑰並自動加入 Favorite。相較於僅依賴頻道廣播,DM 提供了更強的身份確認管道。
最重要的一點
對常聯絡的節點(例如固定基礎節點、信任的群組成員),主動加入 Favorite 是目前防禦節點污染最直接有效的方式。Favorite 節點不受 NodeDB 淘汰機制影響,攻擊者的 NodeDB 洗牌策略對其完全失效。

根本解法:訊息簽名(Message Signing)

官方正在推進的 Message Signing 機制,是從根本上解決節點污染問題的方向。原理是:每個 NodeInfo 封包附上發送方私鑰的數位簽名,任何收到封包的節點都可用公鑰驗簽——假封包因缺乏私鑰,驗簽失敗後直接被韌體丟棄。

三種演算法的比較

RSA-2048
簽名時間
500–800 ms
簽名大小
256 bytes(塞滿封包)
RAM 需求
10–20 KB
結論
不可行
Ed25519 ← 官方方向
簽名時間
10–30 ms
簽名大小
64 bytes
RAM 需求
2–4 KB
結論
最可行
HMAC-SHA256
簽名時間
< 1 ms
簽名大小
32 bytes
RAM 需求
< 1 KB
結論
仍為對稱驗證,治標不治本

對訊息長度的影響(UTF-8 編碼)

加入 Ed25519 簽名(64 bytes)後,訊息有效空間從 200 bytes 縮減至 136 bytes。對中文使用者的影響:

英文(1 byte/字元)200 字 → 136 字(-32%)
現狀 200 字
簽名後 136 字
中文 / 日文(3 bytes/字元)66 字 → 45 字(-21 字)
現狀 66 字
簽名後 45 字
UTF-8 編碼的位元組差異
英文字母在 UTF-8 下佔 1 byte,中文字元佔 3 bytes。在相同的封包空間限制下,中文訊息可容納的字元數約為英文的三分之一,這是傳輸成本的差異。

建議的實作策略

考量硬體資源與使用體驗,官方可能採用分階段導入:

階段對象理由狀態
第一階段NodeInfo 封包空間充裕(payload 約 80–120b),效益最高進行中
第二階段一般訊息(可選)由頻道設定決定是否啟用,兼顧使用體驗規劃中
長期所有封包類型包含位置封包、Admin 封包等待定

總結:風險評估與行動清單

節點污染是 Mesh 網路去中心化設計下的結構性限制,並非個別實作的疏失。了解它的邊界(能做什麼、不能做什麼),比過度擔心更有建設性。

可立即執行的防禦
① 將常聯絡節點加入 Favorite(最重要)   ② 別用 Default Channel 處理需要身份識別的通訊   ③ 重要聯絡人透過 QR Code 或 DM 交換   ④ 看到 App 的紅色公鑰警示不要忽略
持續追蹤的開發進展
Message Signing(Ed25519)實作進度 · NodeDB Favorite 強化 · App 公鑰警示 UX 改善

硬體加密支援程度對簽名效能的影響:不同平台的 Ed25519 簽名速度差異顯著。純軟體實作(如 nRF52840)約需 10–30 ms,在 LoRa 秒級封包週期內可接受,但 CPU 全程佔用;大數運算輔助(如 ESP32-S3 的 MPI 加速器)實際加速效果有限,視函式庫不同約需 30–100 ms;真正的 ECC 硬體加速(如 nRF54L15 的 CRACEN、ESP32-C6 的 ECC 周邊)可將簽名壓縮至 1–15 ms 且幾乎不佔用 CPU,並可提供私鑰硬體隔離保護。硬體支援程度越高,簽名機制對裝置效能與電池壽命的影響就越小。
永遠適用的心態
把 Meshtastic 公開頻道視同無線電廣播:頻道內所有人都能聽到你的名字、位置、裝置型號。私訊(DM)才是真正的私密通道。