Android / 完整案例 / 閱讀約 18 分鐘

Aegis:為什麼驗證碼到第 60 秒會變化?

驗證器看起來只是六位數字和一個倒計時。跟隨公開紀錄的 REA Aegis 分析,再親手試試這個可以控制時間的小型實作。

本頁內容
目標

還原一種基於時間的驗證碼演算法,在瀏覽器中實作它,並驗證兩個 30 秒時間視窗之間的邊界。

開始之前

示範可以直接使用。若要重複 APK 分析,需要 REA、Aegis v3.4.3、完整的 JDK 17+,以及我們在以下教學中介紹的 jadx 分析後端: Android 教學。

01. 從第 59 秒調到第 60 秒

點選下方兩個時間按鈕。使用固定的公開測試金鑰,第 59 秒得到 287082;第 60 秒得到 359152。再調回第 30 秒,第一組驗證碼就會出現,因為第 30 秒和第 59 秒屬於同一個時間視窗。

每 30 秒變化的驗證碼 互動實驗

公開測試金鑰 · SHA-1 · 6 位數字

287082

Unix 時間 59秒 計數器 1

0 秒30 秒60 秒90 秒120 秒

59 ÷ 30 → 計數器為 1。到第 60 秒時,計數器變為 2。

使用 RFC 6238 公開測試金鑰的獨立教學實作。不涉及帳戶金鑰,也不會在瀏覽器中呼叫 REA。

這些數值表示自 Unix 紀元開始經過的秒數,並非鐘錶顯示的秒數。示範實作標準 TOTP,使用公開的 ASCII 金鑰 12345678901234567890。它不會讀取 Aegis 金鑰庫,也不會使用帳戶金鑰。

02. 在 APK 中找到基於時間的方法

REA 官方報告 使用 REA 6.1.0 分析了 Aegis v3.4.3。要沿著報告的路徑分析,請先 取得該版本,紀錄其雜湊值,再搜尋 TOTP 類。下方指令使用 REA 6.4.0。

終端機
npx -y rea-agents@6.4.0 inspect-android-package "/absolute/path/aegis-v3.4.3.apk" --json
npx -y rea-agents@6.4.0 search-android-classes "/absolute/path/aegis-v3.4.3.apk" Totp --json

使用工具回傳的完整類別名稱檢視成員。 getOtp 的時間戳多載很實用,因為可以直接指定時間。請從成員清單中選擇這一多載,不要預設同名的第一個方法就是它。

分析提示詞
使用 REA 分析 /absolute/path/aegis-v3.4.3.apk 中的 TotpInfo 類別。選擇接受時間戳的 getOtp 多載。沿呼叫鏈追蹤計數器編碼、HMAC、截斷和十進位格式化。還原預設週期、雜湊演算法和位數。引用檢視過的每個方法,區分預設值與各帳戶的設定。不要執行 APK。

03. 還原完整計算過程

發現除以 30 只是起點。上游報告串起了五個階段:對時間向下取整得到計數器;將計數器編碼為八個大端位元組;用金鑰計算 HMAC;從雜湊中擷取正的 31 位整數;取模得到六位數字,並保留前導零。

時間→計數器→HMAC→6 位數字

沿工具回傳的方法呼叫繼續追蹤,不要只依賴熟悉的原始碼名稱。在分析的版本中,最佳化將生成器輔助方法放在 kotlin.ExceptionsKt下。報告也區分了預設的 SHA-1、六位數字、30 秒與帳戶自訂設定。

04. 重建規則,測試邊界

獨立實作還原出的行為,再用公開參考測試向量驗證。測試時間邊界前後、帶前導零的結果,以及六位和八位輸出。數學上並不保證相鄰時間視窗的驗證碼一定不同,儘管本範例中確實不同。

重建提示詞
為已還原的行為編寫一個小型獨立 TOTP 實作。僅使用 RFC 6238 公開測試金鑰。驗證全部六個 SHA-1 參考時間戳的八位結果及其六位餘數。測試 29/30 和 59/60 秒邊界,保留前導零。說明與分析方法之間的任何差異;不要聲稱重建了金鑰庫或 Android 應用程式。
Unix 時間計數器六位結果驗證內容
290755224首個視窗末尾
301287082跨過邊界
591287082同一視窗
602359152下一個計數器
111111110937037036081804保留前導零

05. 理解「133 項驗證」的含義

上游專案報告:由選定反編譯方法組成的 JVM 測試程式,與獨立重建實作,在 133 組輸入上結果一致。它沒有啟動原始 APK。這支持選定演算法的一致性,並不能證明完整應用程式等價。

本站另外編寫了 WebCrypto 示範,對六個已釋出的 SHA-1 測試向量分別驗證兩種位數,並將第 0 到第 120 秒的每個整數秒與獨立的 Node HMAC 實作進行比較。我們沒有重複原始 APK 分析或其 Java 測試程式。

來源: REA 的 Aegis 證據報告 · RFC 6238 測試向量。示範和說明均獨立編寫,本站未再分發 Aegis 應用程式原始碼。

下一個分析Notion 如何複製富文字? →

第一次使用這個工具? REA 是什麼? · 我們如何查核教學