【Android安全-怎么针对Socket通信防护?】此文章归类为:Android安全。
我之前也遇到过 Socket 通信安全的问题,后来总结了一些防护措施,分享一下。
1. 传输安全,不能让数据裸奔
首先,最基本的就是全程加密,不然数据在传输途中被劫持了就没办法了。
1 2 3 | 必须用 TLS 1.2 / 1.3 * * (别用 TLS 1.0 / 1.1 ,早就被淘汰了)。
双向认证(mTLS) * * ,不仅客户端验证服务器,服务器也要验证客户端,防止被伪造请求。
SL Pinning(证书固定) * * ,不然有些攻击者会用假证书中间人攻击。
|
我一般会用 OkHttp 配合 SSL Pinning,代码大概是这样:
1 2 3 4 5 6 7 | CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add( "example.com" , "sha256/xxxxxxxxxxxxxxxxxxxxx=" )
.build();
OkHttpClient client = new OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build();
|
但有些人会用 Frida 或 Xposed 绕过 SSL Pinning,所以后面要加反 Hook 保护。
2. 防抓包,别让人拦截数据
即使用了 TLS,有些人还是能通过代理工具(Burp Suite、Fiddler)抓包。所以,我会在代码里检测代理:
1 2 3 4 | private boolean isUsingProxy() {
String proxyAddress = System.getProperty( "http.proxyHost" );
return proxyAddress != null ;
}
|
另外,还可以检测 VPN:
1 2 3 4 | private boolean isUsingVPN() {
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_VPN;
}
|
如果发现设备开了代理或 VPN,可以直接阻止请求或者发个警告。
3. 加密数据,别让 Hook 直接读明文
就算数据经过 TLS 保护了,还是有可能被 Hook API 拿到明文。所以,我会在应用层再加一层加密,比如:
1 2 3 | AES + HMAC 签名 * * (对称加密,速度快)
RSA 或 ECC 交换密钥 * * (用来生成 AES 密钥)
时间戳 + 随机数 * * (防止重放攻击)
|
用 AES 加密数据:
1 2 3 | Cipher cipher = Cipher.getInstance( "AES/CBC/PKCS5Padding" );
cipher.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(ivBytes));
byte [] encryptedData = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
|
服务器收到后,先用 HMAC 校验数据有没有被篡改,再解密。
4. 反 Hook,防止 Frida/Xposed 作弊
有些会用 Frida、Xposed Hook 加密函数,直接拿明文数据。这种情况,会:
检测 Frida
1 2 3 4 5 6 7 8 9 | public static boolean detectFrida() {
String[] fridaLibs = { "frida-agent" , "libfrida" };
for (String lib : fridaLibs) {
if ( new File( "/system/lib/" + lib).exists() || new File( "/system/lib64/" + lib).exists()) {
return true ;
}
}
return false ;
}
|
检测 Xposed
1 2 3 4 5 6 7 8 | public static boolean isXposedActive() {
try {
Class.forName( "de.robv.android.xposed.XposedBridge" );
return true ;
} catch (ClassNotFoundException e) {
return false ;
}
}
|
检测是否被调试
1 2 3 | public static boolean isDebuggerAttached() {
return android.os.Debug.isDebuggerConnected();
}
|
一旦检测到这些情况,通常会直接关闭 App 或者上报服务器,避免被分析。
5. 反编译防护,别让人轻松看代码
很多时候,攻击者会直接反编译 APK,看看加密逻辑。大部分会:
1 2 3 | 代码混淆(ProGuard / R8)
核心逻辑用 C / C + + 写(JNI),增加逆向成本
重要数据用白盒加密存储
|
ProGuard 混淆代码:
-keepclassmembers class * {
@Keep;
}
虽然 ProGuard 不能完全防止逆向,但至少能增加点难度。
6. 服务器端也要做防护
有时候攻击者会模拟客户端请求,直接篡改数据发给服务器,所以服务器端也要加保护:
1 2 3 4 | HMAC 校验数据完整性
限制 IP 频繁请求(防止暴力破解)
检测异常流量
日志监控,发现异常行为
|
用 HMAC 签名:
1 2 3 | Mac mac = Mac.getInstance( "HmacSHA256" );
mac.init( new SecretKeySpec(secretKey.getBytes(), "HmacSHA256" ));
byte [] signature = mac.doFinal(data.getBytes());
|
服务器端拿到数据后,先用 HMAC 计算一遍,看跟客户端传来的签名是不是一致的,不一致就说明数据被篡改了。
总结
防护措施 |
目的 |
关键技术 |
TLS 加密 |
防止流量被监听 |
TLS 1.3 + 双向认证 |
SSL Pinning |
防止 MITM |
OkHttp 证书固定 |
数据加密 |
防止 Hook |
AES + HMAC |
代理检测 |
防止抓包 |
代理/VPN 识别 |
反 Hook |
防止 Frida/Xposed |
进程检测 |
代码混淆 |
防止反编译 |
ProGuard / JNI |
服务器防护 |
防止伪造数据 |
HMAC + 速率限制 |
一般来说,如果只是防止普通抓包,用 TLS + SSL Pinning 就够了;但如果要对抗高级攻击,就得多层加密 + 反 Hook + 服务器验证。
防护不是一劳永逸的,每次升级安全方案,攻击者也会找新方法绕过,所以得不断优化!
更多【Android安全-怎么针对Socket通信防护?】相关视频教程:www.yxfzedu.com