用加密算法逆向分析與安全實(shí)踐)
1. 移動應(yīng)用安全逆向工程概述在移動互聯(lián)網(wǎng)時代各類招聘類應(yīng)用承載著大量用戶敏感信息與求職數(shù)據(jù)。作為安全研究人員我們時常需要對這類應(yīng)用進(jìn)行安全評估其中加密校驗(yàn)算法的逆向分析是核心環(huán)節(jié)之一。這次我們以某主流招聘應(yīng)用為例深入剖析其通信過程中的加密機(jī)制。這類應(yīng)用通常會在以下環(huán)節(jié)實(shí)施加密保護(hù)用戶登錄認(rèn)證流程簡歷數(shù)據(jù)傳輸企業(yè)信息交換即時通訊內(nèi)容支付交易過程2. 分析環(huán)境搭建與工具準(zhǔn)備2.1 基礎(chǔ)環(huán)境配置進(jìn)行逆向分析需要準(zhǔn)備以下環(huán)境安卓真機(jī)或模擬器推薦Android 7-9版本抓包工具Charles/Fiddler配置SSL證書反編譯工具Jadx-GUI、Apktool動態(tài)調(diào)試工具Frida、Xposed框架代碼分析工具IDA Pro、Ghidra重要提示所有分析工作應(yīng)在合法授權(quán)的范圍內(nèi)進(jìn)行確保不違反用戶協(xié)議和相關(guān)法律法規(guī)。2.2 應(yīng)用樣本獲取與處理首先需要獲取目標(biāo)應(yīng)用的APK文件從官方渠道下載最新版本安裝包使用apktool d命令解包通過Jadx-GUI查看Java偽代碼對native庫進(jìn)行IDA反匯編樣本處理時需要特別注意保留原始簽名信息記錄應(yīng)用版本號備份關(guān)鍵資源文件3. 通信協(xié)議逆向分析3.1 網(wǎng)絡(luò)請求抓包與觀察使用抓包工具捕獲典型業(yè)務(wù)場景的請求登錄請求/api/v3/login簡歷查詢/api/v4/resume/search消息獲取/api/v2/msg/list觀察到的請求特征POST /api/v3/login HTTP/1.1 X-Sign: a1b2c3d4e5f6 X-Timestamp: 1654321000 Content-Type: application/json {phone:188****1234,password:加密數(shù)據(jù)}3.2 簽名算法定位通過以下方法定位加密關(guān)鍵點(diǎn)搜索X-Sign相關(guān)字符串跟蹤網(wǎng)絡(luò)庫調(diào)用棧分析參數(shù)預(yù)處理流程發(fā)現(xiàn)簽名生成位于native層// 偽代碼示例 public class SecurityUtil { public static native String generateSign(String params, long timestamp); }對應(yīng)的so庫逆向顯示關(guān)鍵函數(shù)JNIEXPORT jstring JNICALL Java_com_example_SecurityUtil_generateSign( JNIEnv *env, jobject obj, jstring params, jlong timestamp) { // 實(shí)際加密邏輯 }4. 加密算法深度解析4.1 算法還原過程通過動態(tài)調(diào)試還原出完整算法流程參數(shù)排序按字典序排列所有參數(shù)字符串拼接key1value1key2value2...添加時間戳拼接timestamp1654321000密鑰混合拼接固定密鑰secret2022哈希計算SHA256哈希處理Base64編碼最后輸出結(jié)果算法偽代碼實(shí)現(xiàn)def generate_sign(params, timestamp): sorted_params sorted(params.items()) query_str .join([f{k}{v} for k,v in sorted_params]) raw_str f{query_str}×tamp{timestamp}secret2022 hash_bytes hashlib.sha256(raw_str.encode()).digest() return base64.b64encode(hash_bytes).decode()4.2 關(guān)鍵保護(hù)機(jī)制應(yīng)用采用了多種反逆向措施代碼混淆Proguard動態(tài)加載DexClassLoader簽名校驗(yàn)PackageManager調(diào)試檢測android.os.Debug環(huán)境檢測模擬器識別5. 完整校驗(yàn)流程實(shí)現(xiàn)5.1 請求構(gòu)造示例以登錄接口為例展示完整請求構(gòu)造import hashlib import base64 import time import requests def make_request(phone, password): params { phone: phone, password: encrypt_password(password), device_id: a1b2c3d4 } timestamp int(time.time()) # 生成簽名 sign generate_sign(params, timestamp) # 構(gòu)造請求頭 headers { X-Sign: sign, X-Timestamp: str(timestamp), Content-Type: application/json } # 發(fā)送請求 response requests.post( https://api.example.com/api/v3/login, jsonparams, headersheaders ) return response.json()5.2 響應(yīng)驗(yàn)證機(jī)制服務(wù)端響應(yīng)同樣包含校驗(yàn)機(jī)制響應(yīng)頭包含X-Signature字段響應(yīng)體數(shù)據(jù)需要校驗(yàn)完整性關(guān)鍵業(yè)務(wù)數(shù)據(jù)額外加密時效性驗(yàn)證5分鐘有效期響應(yīng)驗(yàn)證示例代碼def verify_response(response): server_sign response.headers.get(X-Signature) timestamp response.headers.get(X-Timestamp) data response.json() # 生成本地簽名 local_sign generate_sign(data, timestamp) if local_sign ! server_sign: raise Exception(響應(yīng)簽名驗(yàn)證失敗) # 檢查數(shù)據(jù)時效 if time.time() - int(timestamp) 300: raise Exception(響應(yīng)已過期) return data6. 常見問題與調(diào)試技巧6.1 典型錯誤排查錯誤現(xiàn)象可能原因解決方案簽名無效參數(shù)順序錯誤確保按字典序排序請求過期時間不同步同步設(shè)備時間響應(yīng)驗(yàn)證失敗簽名密鑰變更更新密鑰版本無法抓包SSL Pinning使用Frida繞過6.2 動態(tài)調(diào)試技巧Frida腳本示例繞過SSL校驗(yàn)Java.perform(function() { var CertificatePinner Java.use(okhttp3.CertificatePinner); CertificatePinner.check.overload(java.lang.String, [Ljava.security.cert.Certificate;).implementation function() { console.log(Bypassing SSL pinning); }; });關(guān)鍵函數(shù)Hook示例Interceptor.attach(Module.findExportByName(libsecurity.so, generate_sign), { onEnter: function(args) { console.log(Params:, Memory.readCString(args[1])); console.log(Timestamp:, args[2]); }, onLeave: function(retval) { console.log(Sign result:, Memory.readCString(retval)); } });7. 安全建議與防護(hù)方案7.1 客戶端加固措施對于應(yīng)用開發(fā)者建議使用白盒加密方案實(shí)現(xiàn)動態(tài)密鑰分發(fā)增加代碼混淆強(qiáng)度定期更新加密算法加強(qiáng)運(yùn)行時環(huán)境檢測7.2 服務(wù)端防護(hù)策略請求頻率限制異常行為檢測簽名算法輪換請求時效嚴(yán)格控制關(guān)鍵操作二次驗(yàn)證在實(shí)際分析過程中我們發(fā)現(xiàn)該應(yīng)用的加密實(shí)現(xiàn)存在一些可以優(yōu)化的地方比如密鑰硬編碼問題、缺乏算法混淆等。通過這次逆向分析不僅理解了主流招聘應(yīng)用的加密實(shí)現(xiàn)方式也為后續(xù)的安全評估工作積累了寶貴經(jīng)驗(yàn)。