如何提取Flutter安卓APP中动态生成JWT的签名密钥?
安卓APP内部JWT签名密钥与生成方法分析方案
针对你遇到的场景,结合已搭建的Frida和Burp Suite,可通过以下步骤定位JWT签名方法并获取密钥:
1. Hook Java层HMAC-SHA256核心加密方法
HS256本质是HMAC-SHA256算法,直接hook加密核心类的关键方法,可捕获密钥和待签名数据:
Java.perform(function() { var Mac = Java.use("javax.crypto.Mac"); // Hook密钥初始化方法,输出密钥的十六进制格式 Mac.init.overload("java.security.Key").implementation = function(key) { var secretKey = Java.cast(key, Java.use("javax.crypto.spec.SecretKeySpec")); console.log("HMAC密钥(hex): " + secretKey.getEncoded().toString('hex')); return this.init(key); }; // Hook签名数据输入方法,输出待签名的原始内容(即JWT的header.payload部分) Mac.doFinal.overload("[B").implementation = function(data) { console.log("待签名数据: " + Buffer.from(data).toString('utf8')); return this.doFinal(data); }; });
2. Hook常见第三方JWT库的签名方法
多数APP会使用成熟JWT库生成令牌,直接hook对应库的签名方法更高效:
针对JJWT库
Java.perform(function() { var DefaultJwtSigner = Java.use("io.jsonwebtoken.impl.DefaultJwtSigner"); DefaultJwtSigner.sign.overload("[B").implementation = function(data) { console.log("JJWT待签名数据: " + Buffer.from(data).toString('utf8')); console.log("JJWT密钥(hex): " + this.key.getEncoded().toString('hex')); return this.sign(data); }; });
针对Auth0 JWT库
Java.perform(function() { var JWTCreator = Java.use("com.auth0.jwt.JWTCreator.Builder"); JWTCreator.sign.implementation = function() { console.log("Auth0 JWT Header: " + JSON.stringify(this.header)); console.log("Auth0 JWT Payload: " + JSON.stringify(this.payload)); var secret = this.algorithm.secret; if (secret) { console.log("Auth0密钥: " + secret.toString('utf8')); } return this.sign(); }; });
3. 内存搜索定位签名调用栈
如果上述hook未命中,可通过内存搜索目标JWT的header.payload字符串,回溯调用栈找到签名逻辑:
Java.perform(function() { var targetJwtPrefix = '{"alg":"HS256","typ":"JWT"}.{"auth_token":"d871be6fffbb1b6318119c1be4ea7f44c3be08119","id":81,"issuedTime":1730122121.013}'; Process.enumerateModules().forEach(function(module) { try { Memory.scan(module.base, module.size, targetJwtPrefix, { onMatch: function(address) { console.log("找到目标JWT字符串地址: " + address.toString()); // 打印当前调用栈 console.log("调用栈:\n" + Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())); }, onComplete: function() {} }); } catch(e) {} }); });
4. 静态分析辅助定位
若APP存在代码混淆,可配合jadx反编译APP,搜索HS256、JWT、auth_token等关键词,定位到签名相关代码块后,再用Frida精准hook对应方法。
内容的提问来源于stack exchange,提问作者tzippy
相关产品推荐
相关产品推荐

