瀏覽器已存密碼寫成 AES-256-GCM 之後,為什麼它保護的不是「本機程式讀不到」

密碼管理員裡那一行「已加密」,很容易被讀成:這台電腦上的其他程式拿不走明文。2026 年 9 月 25 日,K7 Labs 的分析把這件事又推回檯面:有一類程式會讀取瀏覽器裡儲存的口令、付款卡紀錄和工作階段。口令欄位採用 AES-256-GCM,只說明磁碟上不是明文。能不能讀出來,取決於解開這把金鑰的資格落在「目前這個 Windows 使用者」,還是「瀏覽器程式自己」。

先記結論:AES-256-GCM 回答的是「密碼庫檔案裡的口令欄位是不是明文」。它不回答「誰握著解開它的金鑰」。Google 在 2024 年 7 月 30 日寫過,Windows 上的 DPAPI 擋的是其他使用者,以及關機後把磁碟拷走;擋不住以目前登入使用者身分執行的程式。Chrome 127 起先把 Cookie 改成應用程式綁定加密,把這道門從「使用者」收窄到「瀏覽器程式」。兩代邊界都不是「本機任何程式都讀不到」。

一句話先回答搜尋意圖

搜「瀏覽器儲存的密碼是不是加密了,所以惡意程式也看不到」,想確認的通常是同一件事:我點過儲存之後,這台電腦上的其他程式還能不能讀出明文。演算法名稱幫不上這個忙。Google 安全部落格把 Windows 上的舊邊界寫得很直:Chrome 用作業系統提供的資料保護 API(DPAPI)保護 Cookie 和密碼這一類敏感資料。保護對象是系統上的其他使用者,以及關機之後把磁碟拷走;能夠以目前登入使用者身分執行的程式,不在這道門外面。

這篇文章給兩類人。一類是在評審「瀏覽器已經加密儲存,我們就不用再管口令落在磁碟上」的開發者和維運。另一類是這幾天看到安全報導、想知道自己設定頁裡的「已加密」到底證明了什麼的人。它不寫如何從密碼庫裡解出別人的口令,也不代替 密碼產生器 的操作說明。你要帶走的是三層可以分開核對的事實:密文證明什麼、金鑰包裝證明什麼,以及 2026 年 9 月 25 日那份報告沒有證明什麼。

磁碟上的 AES-256-GCM 只證明不是明文

Chromium 系瀏覽器把已存登入寫在本機設定裡。較新的口令欄位用 AES-256-GCM 封裝。你用文字編輯器打開那個庫,看不到網站密碼的原文,這是真的。GCM 在這裡做的是:沒有對應金鑰時,改一個位元組也會使校驗失敗,不能把密文當成可以偷偷改掉的明文。

瀏覽器必須在你下次打開登入框時把口令填回去,所以這把金鑰不能只存在一個你自己才記得、任何程式都問不到的口令裡。它要能被這台機器上的瀏覽器在解鎖工作階段之後拿出來用。於是真正的問題從「演算法強不強」換成「誰有資格向系統要這把金鑰」。演算法再強,資格若落在「目前已經登入的這個 Windows 使用者」,那麼以這個使用者身分啟動的程式就和瀏覽器站在同一側。

這也是它和「你自己持有口令的本機加密」不是同一句話的原因。檔案若用你輸入的口令在瀏覽器裡做 AES-256-GCM,雲端和其他程式預設沒有這串口令,就打不開檔案。瀏覽器密碼庫的設計目標是自動填入,金鑰的使用資格必須留在本機的瀏覽器一側。看到同一個演算法名稱,不能把兩種金鑰歸屬當成一件事。

Google 自己寫過的那道邊界

同一篇 2024 年 7 月 30 日的說明把作業系統差異也寫了:macOS 走鑰匙圈,Linux 走系統提供的錢包(例如 kwallet 或 gnome-libsecret),Windows 走 DPAPI。下面關於「目前登入使用者啟動的程式」的那一句,是 Google 對 Windows DPAPI 的描述,不要直接套到每一台 Mac。鑰匙圈可以跳出系統確認,邊界和「任何同使用者行程默默解包」不是同一套互動。

在 Windows 上,DPAPI 把金鑰和這個使用者的登入材料綁在一起。另一個 Windows 帳戶打開你的設定目錄,或者有人在關機後把硬碟拆走、又沒有你的登入秘密,預設解不開。這就是「加密了」在產品說明裡最站得住的那一半。另一半是 Google 寫明的缺口:惡意程式若已經能以目前使用者身分執行,就可以走和瀏覽器相同的系統介面去要這把金鑰。加密沒有失效,門的位置本來就畫在「其他使用者」,而不是「這個使用者的其他行程」。

所以評審一句「密碼庫採用 AES-256-GCM,因此本機惡意程式讀不到」時,應把它拆開。前半句可以用庫檔案不是明文來支撐。後半句在 DPAPI 這一代上,和 Google 的公開說明相反。需要另找證據的是:這台瀏覽器是否已經把這一類秘密遷到下一道門,而不是演算法名稱本身。

Chrome 127 把邊界從「使用者」往「程式」收

同一篇說明接著寫:Chrome 127 在 Windows 上引入應用程式綁定加密(App-Bound Encryption)。資料不再允許「任何以目前使用者執行的程式」來解,而是把金鑰綁到瀏覽器程式的身分上,由系統側元件核對呼叫端是不是受信任的瀏覽器,再交出金鑰。官方寫的遷移順序是:先從 Cookie 開始;密碼、付款資料和其他持續有效的登入權杖,列在其後要擴展的範圍,不是 127 發布當天已經全部遷完。

到 2026 年,取證側的公開描述(例如 ElcomSoft 2026 年 1 月的說明)是:對已經啟用應用程式綁定的較新 Chrome 與 Edge 設定,只按舊式「目前使用者解包」去讀的外部程式會失敗。這道新門擋住的是「站在瀏覽器外面的普通行程」。它沒有把「瀏覽器行程內部」也擋在外面。惡意擴充功能,或者已經在瀏覽器行程裡執行的程式碼,仍然站在門內。應用程式綁定改變的是呼叫端資格,不是「只要寫了 AES-256-GCM,記憶體裡的填入邏輯就看不見口令」。

因此有兩句不能互相代替。第一句:我的 Chrome 已經高於 127,所以已存密碼一定遷完了。官方在 2024 年 7 月把密碼寫成其後擴展的對象,你不能用版本號碼自動勾上這一項。第二句:新聞裡還能看到有人用舊式解包讀口令,所以應用程式綁定沒有用。那只說明仍有設定或仍有資料落在舊邊界上,或者樣本描述的就是舊邊界。它證明不了「新邊界已被公開寫成失效」。

你看見的說法 它能支撐的結論 它支撐不了的結論
口令欄位是 AES-256-GCM 庫檔案裡不是明文口令 本機任何程式都讀不到
Windows 用 DPAPI 包裹金鑰 其他使用者、關機後拷走的磁碟預設解不開 目前登入使用者啟動的程式解不開
Chrome 127 應用程式綁定,先覆蓋 Cookie 已遷移的資料,外部程式的舊式解包會失敗 密碼欄位在你這台機器上一定已經遷移;行程內部也讀不到
密碼管理員裡有一筆紀錄 這個網站曾被儲存過 目前用的是哪一代金鑰包裝
關掉「詢問是否儲存密碼」 之後的新登入可以不再入庫 已經在庫裡的紀錄被刪掉

9 月 25 日那份報告能證明什麼

K7 Labs 在 2026 年 9 月 25 日發表了對一類 Windows 程式的分析,隨後幾天被多家安全媒體轉載。報告稱:該程式會從多款 Chromium 系瀏覽器讀取已存密碼、付款卡紀錄、瀏覽歷史和工作階段,並讀取 Firefox 的歷史與 Cookie;較新的口令欄位按 AES-256-GCM 存放,金鑰則透過 Windows 的使用者層級資料保護解開。K7 寫明,他們沒有確認這套程式被散布到多廣、影響了多少台機器。

這份描述對得上上一節的舊邊界:資格在「目前使用者」,同一次登入裡的程式可以站到門內,AES-256-GCM 只負責欄位不是明文。它沒有寫成「已經繞過 Chrome 的應用程式綁定」,也沒有給出可以換成「你的 Chrome 一定中招」的受害人數。把標題裡的演算法名稱理解成「加密已失效」,或者理解成「所以我的密碼庫絕對安全」,都多走了一步。

報告還提醒另一件容易混在一起的事:工作階段和已存密碼是兩份材料。工作階段被帶走之後,攻擊者可以在一段時間內直接使用你已經登入的狀態。你在原網站改掉密碼,作廢的是下一次口令登入,不一定作廢已經發出的工作階段。要處理工作階段,得到帳號的裝置或工作階段清單裡登出,或等網站主動撤銷。這和「密碼庫加密強不強」無關。更早關於「改密碼擋不住已登記工作階段」的核對,見通行金鑰那篇,不要把兩件事合成一個開關。

不要為了「驗證新聞是不是真的」去解自己的密碼庫,也不要用真實網路銀行、信箱或雲端主控台口令做實驗。下面的核對只看設定頁裡有沒有儲存紀錄、儲存提示是否還開著。解出明文、匯出整庫,都不在本文的核對範圍內。

當場核對:看清單,不拆資料庫

口號和新聞標題都不能代替你這台瀏覽器的設定。準備一個可丟棄的測試網站帳號即可。下面四步在目前瀏覽器裡做完,不需要把設定目錄拷出來。

  1. 打開瀏覽器自帶的密碼管理員(設定中的「密碼/自動填入」,或網址列進入該瀏覽器的密碼管理頁)。只看網站清單:信箱、網路銀行、雲端主控台、程式碼託管有沒有各佔一行。不要點顯示明文,不要匯出。
  2. 找到「詢問是否儲存密碼」或等價開關。它決定下一次登入會不會再入庫。關掉它不會刪除已經存在的紀錄;要刪得在清單裡逐筆移除,或使用瀏覽器提供的清除已存密碼。
  3. 打開「關於」頁,確認瀏覽器仍在接收官方更新,記下版本號碼。版本號碼證明不了密碼欄位已經遷到應用程式綁定。設定頁也不會印出 DPAPI 或應用程式綁定這幾個字。不要為此去翻設定目錄裡的金鑰前綴。
  4. 若你懷疑這台電腦已經在跑來路不明的程式:不要在這台機器上點「顯示密碼」。換一台你還信任的裝置,到重要網站登出其他工作階段並更換口令。各站口令不要重複使用。這一步處理的是影響,不是在本機上把密碼庫解開來「看看到底能不能讀」。

版本號碼回答不了金鑰在哪一代

Chrome 127 是應用程式綁定開始覆蓋 Cookie 的版本,不是「所有已存密碼在這一天改了包裝」的版本。你看到 130、140 或更高,只能說明主版本已經晚於那個起點。密碼欄位有沒有遷完,官方說明留了「其後的版本」這個範圍,介面又不展示包裝代別。把版本號碼抄進評審表,旁邊應寫「不能由此斷定密碼庫已應用程式綁定」,而不是打一個勾。

儲存提示才是入庫開關

很多口令進庫,不是因為某個加密頁「同步上傳」,而是登入成功後瀏覽器問了一句要不要儲存,人點了儲存。此後這筆紀錄就落在上面說的那道門裡面。產生一個只在本機出現的口令,只要你拒絕儲存,它就不會變成密碼管理員裡的一列。拒絕儲存證明不了頁面指令碼沒有把口令發出去,那要用網路面板另核;它只證明你沒有把這串交給瀏覽器的已存密碼清單。

四種把「已加密」讀過頭的情況

第一,把 AES-256-GCM 讀成「惡意程式讀不到」。這個演算法說明欄位不是明文,也說明沒有金鑰就改不了密文。金鑰若用 DPAPI 包給目前使用者,Google 已經寫明:以該使用者身分執行的程式不在保護範圍外。演算法名稱和門的位置是兩行字。

第二,把「我有 Windows 登入密碼」讀成「密碼庫對惡意程式免疫」。登入密碼的作用,是讓別的帳戶和關機後拷走的磁碟解不開 DPAPI。程式若已在你登入之後執行,它使用的就是這個已解鎖的使用者環境。登入密碼仍要設,它回答的是另一道門。

第三,把「版本高於 127」讀成「已存密碼和 Cookie 都已應用程式綁定,行程內部也看不見」。官方寫的起點是 Cookie,密碼是其後擴展的對象。應用程式綁定擋住的是瀏覽器外面的舊式解包。擴充功能和已經在瀏覽器行程裡執行的程式碼,不因這道門而突然變成盲的。

第四,把「每個網站用了不同口令」讀成「整庫被讀走也沒關係」。不同口令能攔住的是:一個網站的資料庫外洩之後,拿同一串去撞你的信箱和雲端主控台。它攔不住「程式一次讀走密碼管理員裡全部已存紀錄」。兩道控制都值得做,它們覆蓋的失敗不是同一種。

常見問題

密碼管理員顯示已加密,是不是本機其他程式就讀不到?

不能這樣讀。已加密只說明磁碟上的口令欄位不是明文。在 Windows 的 DPAPI 這一代,Google 寫明擋的是其他使用者,以及關機後把磁碟拷走;擋不住以目前登入使用者身分執行的程式。Chrome 127 起的應用程式綁定先覆蓋 Cookie,外部程式對已遷移資料的舊式解包會失敗;瀏覽器行程內部仍然讀得到。介面上的「已加密」三個字,不會告訴你這台機器的密碼欄位落在哪一代。

Chrome 127 的應用程式綁定,是不是等於惡意程式也解不開已存密碼?

不是。2024 年 7 月 30 日的說明把密碼和付款資料寫成其後版本才擴展的對象,不是 127 發布當天已經全部遷完。應用程式綁定把資格從「目前使用者」收窄到「被系統元件認可的瀏覽器程式」。這能解釋為什麼只走舊式使用者解包的外部程式,在已遷移的資料上會失敗。它不說明行程內部的程式碼被擋在門外,也不說明你這台瀏覽器的每一筆已存密碼都已經完成遷移。

9 月 25 日的報告,是不是說明我的 Chrome 密碼已經能被任意程式讀走?

不能直接換成這個結論。報告描述的是一類 Windows 程式會讀取多款 Chromium 系瀏覽器的已存密碼、付款卡、歷史和工作階段,以及 Firefox 的歷史和 Cookie,並稱口令欄位使用 AES-256-GCM、金鑰走使用者層級的資料保護。K7 沒有給出受害人數,也沒有把該樣本寫成已經繞過應用程式綁定。你自己的瀏覽器落在哪一代,要看儲存清單和是否仍在更新,而不是用這篇報導的演算法名稱代替。

改掉網站密碼之後,已經儲存的工作階段會不會一起失效?

不一定。改密碼作廢的是下次用這串口令登入。已經發出的工作階段,往往還要在帳號的裝置清單裡登出其他工作階段,或由網站撤銷。同一類程式會把工作階段和已存密碼一起拿走。只改一處口令、不登出其他工作階段,處理的是口令,不是工作階段。

FastPwd 會不會把產生的密碼存進瀏覽器密碼庫?

不會自己寫入瀏覽器的已存密碼清單,站內也沒有密碼庫。是否入庫取決於你有沒有在瀏覽器彈出的儲存提示裡點儲存。產生走 crypto.getRandomValues,長度 6–128 字元、預設 16 字元,結果預設不上傳。開啟即用,無需帳號。若本機已有能讀目前分頁或剪貼簿的程式,頁面上的明文同樣看得見,這不是上傳邊界能代替的。

用開啟即用的產生器對照一次「不入庫」

若你想看清「口令出現過」和「口令進入瀏覽器密碼庫」不是同一步,可以打開 FastPwd 的 密碼產生器。無需註冊。亂數模式用預設 16 字元,產生一串可丟棄的口令。瀏覽器若彈出儲存提示,選擇不儲存。再回到密碼管理員,清單裡不應新增剛才那個測試網站。FastPwd 自己不維護密碼庫,也不會替你寫入瀏覽器的已存密碼清單。

產生使用 crypto.getRandomValues。長度 6–128 字元,預設 16 字元;低於 8 字元會提示安全性較低。結果預設不上傳。打開開發者工具的 Network,勾選保留日誌,用整串口令搜尋請求行和請求體,業務請求裡不應出現這串。這一步證明的是「這次沒有作為 HTTP 正文離開分頁」,證明不了本機惡意程式讀不到頁面或剪貼簿。若這台電腦已經不可信,換一台裝置再產生、再登入。

產生之後若還要看這串像不像公開高頻名單裡的弱密碼,另取一串可丟棄的測試字元,在 密碼檢測 裡對照。待測密碼不上傳。未命中不能證明全網沒見過,命中只說明太常見。不要把剛要啟用的真口令貼進檢測框,也不要把瀏覽器密碼庫整庫匯出再拿去檢測。

若這串口令必須交給另一個人一次,不要貼進會進伺服器日誌的工單正文,改走 閱後即焚:伺服器只暫存密文,金鑰放在連結的 # 後面,建立和閱讀都無需帳號。那條通道回答的是「怎樣交一次」,不是「怎樣讓已經儲存在瀏覽器裡的舊口令變安全」。舊紀錄仍要在密碼管理員裡刪除,並在你信任的裝置上更換。

延伸閱讀

頁面上的「本機、不上傳」要用金絲雀在 Network 裡搜,見 瀏覽器本地加密怎麼核對明文沒有離開本機。改密碼擋不住已經發出的工作階段,見 打電話讓你更新通行金鑰,為什麼這招偷走的是工作階段而不是 Passkey。本機弱密碼名單能抓住常見弱密碼、不能當成全網撞庫,見 本地弱密碼名單能證明什麼,為什麼它不是全網撞庫。