Skip to content

Commit e02d6c9

Browse files
committed
feat: mux与tunnel对错误密钥连接进行断开
1 parent 4f33386 commit e02d6c9

File tree

3 files changed

+53
-26
lines changed

3 files changed

+53
-26
lines changed

src/main/java/top/meethigher/proxy/tcp/mux/Mux.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,23 +49,33 @@ public Mux(Vertx vertx, String secret) {
4949
* @return 返回configuration加密后的base64串(无换行)
5050
*/
5151
public Buffer aesBase64Encode(MuxConfiguration configuration) {
52-
String addr = configuration.toString();
53-
SecretKey key = restoreKey(secret.getBytes(StandardCharsets.UTF_8));
54-
String encryptedAddr = encryptToBase64(addr.getBytes(StandardCharsets.UTF_8), key);
55-
return TunnelMessageCodec.encode(type, encryptedAddr.getBytes(StandardCharsets.UTF_8));
52+
try {
53+
String addr = configuration.toString();
54+
SecretKey key = restoreKey(secret.getBytes(StandardCharsets.UTF_8));
55+
String encryptedAddr = encryptToBase64(addr.getBytes(StandardCharsets.UTF_8), key);
56+
return TunnelMessageCodec.encode(type, encryptedAddr.getBytes(StandardCharsets.UTF_8));
57+
} catch (Exception e) {
58+
log.error("aes base64 encode occurred exception", e);
59+
return Buffer.buffer();
60+
}
5661
}
5762

5863
/**
5964
* @param buffer 加密内容
6065
* @return buffer解密后的内容
6166
*/
6267
public MuxConfiguration aesBase64Decode(Buffer buffer) {
63-
TunnelMessageCodec.DecodedMessage decode = TunnelMessageCodec.decode(buffer);
64-
String encryptedAddr = new String(decode.body, StandardCharsets.UTF_8);
65-
SecretKey key = restoreKey(secret.getBytes(StandardCharsets.UTF_8));
66-
String addr = new String(decryptFromBase64(encryptedAddr, key),
67-
StandardCharsets.UTF_8);
68-
return MuxConfiguration.parse(addr);
68+
try {
69+
TunnelMessageCodec.DecodedMessage decode = TunnelMessageCodec.decode(buffer);
70+
String encryptedAddr = new String(decode.body, StandardCharsets.UTF_8);
71+
SecretKey key = restoreKey(secret.getBytes(StandardCharsets.UTF_8));
72+
String addr = new String(decryptFromBase64(encryptedAddr, key),
73+
StandardCharsets.UTF_8);
74+
return MuxConfiguration.parse(addr);
75+
} catch (Exception e) {
76+
log.error("aes base 64 decode occurred exception", e);
77+
return null;
78+
}
6979
}
7080

7181

src/main/java/top/meethigher/proxy/tcp/tunnel/ReverseTcpProxyTunnelServer.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -439,11 +439,18 @@ protected boolean doHandle(Vertx vertx, NetSocket netSocket, TunnelMessageType t
439439
protected boolean doHandle(Vertx vertx, NetSocket netSocket, TunnelMessageType type, byte[] bodyBytes) {
440440
// 如果授权通过,并且成功开通端口。则返回成功;否则则返回失败,并关闭连接
441441
boolean result = false;
442+
TunnelMessage.OpenDataPortAck.Builder builder = TunnelMessage.OpenDataPortAck
443+
.newBuilder();
444+
builder.setHeartbeatDelay(heartbeatDelay);
442445
try {
443-
TunnelMessage.OpenDataPort parsed = TunnelMessage.OpenDataPort.parseFrom(aesBase64Decode(bodyBytes));
444-
TunnelMessage.OpenDataPortAck.Builder builder = TunnelMessage.OpenDataPortAck
445-
.newBuilder();
446-
builder.setHeartbeatDelay(heartbeatDelay);
446+
byte[] data = aesBase64Decode(bodyBytes);
447+
if (data == null) {
448+
builder.setSuccess(result).setMessage("your secret is incorrect!");
449+
netSocket.write(encode(TunnelMessageType.OPEN_DATA_PORT_ACK,
450+
builder.build().toByteArray())).onComplete(ar -> netSocket.close());
451+
return result;
452+
}
453+
TunnelMessage.OpenDataPort parsed = TunnelMessage.OpenDataPort.parseFrom(data);
447454
if (secret.equals(parsed.getSecret())) {
448455
synchronized (ReverseTcpProxyTunnelServer.class) {
449456
// 判断dataProxyName是否唯一
@@ -481,17 +488,16 @@ protected boolean doHandle(Vertx vertx, NetSocket netSocket, TunnelMessageType t
481488
builder.build().toByteArray())).onComplete(ar -> netSocket.close());
482489
}
483490
}
484-
485491
} else {
486-
TunnelMessage.OpenDataPortAck ack = TunnelMessage.OpenDataPortAck
487-
.newBuilder()
488-
.setSuccess(result)
489-
.setMessage("your secret is incorrect!")
490-
.build();
492+
builder.setSuccess(result).setMessage("your secret is incorrect!");
491493
netSocket.write(encode(TunnelMessageType.OPEN_DATA_PORT_ACK,
492-
ack.toByteArray())).onComplete(ar -> netSocket.close());
494+
builder.build().toByteArray())).onComplete(ar -> netSocket.close());
493495
}
494-
} catch (Exception ignore) {
496+
} catch (Exception e) {
497+
log.error("open data port doHandle occurred exception", e);
498+
builder.setSuccess(result).setMessage("exception");
499+
netSocket.write(encode(TunnelMessageType.OPEN_DATA_PORT_ACK,
500+
builder.build().toByteArray())).onComplete(ar -> netSocket.close());
495501
}
496502
return result;
497503
}

src/main/java/top/meethigher/proxy/tcp/tunnel/Tunnel.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,18 @@ public void on(TunnelMessageType type, TunnelHandler tunnelHandler) {
7171

7272
/**
7373
* 返回加密base64串(无换行)
74+
*
7475
* @param bodyBytes 原文
7576
* @return 密文
7677
*/
7778
public byte[] aesBase64Encode(byte[] bodyBytes) {
78-
SecretKey key = restoreKey(secret.getBytes(StandardCharsets.UTF_8));
79-
return encrypt(bodyBytes, key);
79+
try {
80+
SecretKey key = restoreKey(secret.getBytes(StandardCharsets.UTF_8));
81+
return encrypt(bodyBytes, key);
82+
} catch (Exception e) {
83+
log.error("aes base64 encode occurred exception", e);
84+
return null;
85+
}
8086
}
8187

8288
/**
@@ -86,8 +92,13 @@ public byte[] aesBase64Encode(byte[] bodyBytes) {
8692
* @return 原文
8793
*/
8894
public byte[] aesBase64Decode(byte[] bodyBytes) {
89-
SecretKey key = restoreKey(secret.getBytes(StandardCharsets.UTF_8));
90-
return decrypt(bodyBytes, key);
95+
try {
96+
SecretKey key = restoreKey(secret.getBytes(StandardCharsets.UTF_8));
97+
return decrypt(bodyBytes, key);
98+
} catch (Exception e) {
99+
log.error("aes base64 decode occurred exception", e);
100+
return null;
101+
}
91102
}
92103

93104
/**

0 commit comments

Comments
 (0)