首页
社区
课程
招聘
1
[原创]怎么针对Socket通信防护?
发表于: 2025-3-20 11:07 1630

[原创]怎么针对Socket通信防护?

2025-3-20 11:07
1630

我之前也遇到过 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 + 服务器验证

防护不是一劳永逸的,每次升级安全方案,攻击者也会找新方法绕过,所以得不断优化!


[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
大枫叶
为你点赞!
2025-3-21 14:33
最新回复 (1)
雪    币: 5
活跃值: (2915)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
点个赞~~~~
2025-4-2 09:42
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册