修改encoder和decoder适配加密过程
This commit is contained in:
+1
-1
@@ -22,7 +22,7 @@ public class ProxyMessageSecureKeyHandler implements ProxyMessageHandler {
|
||||
byte[] decryptedData = SmEncryptUtil.decryptBySm4(secureKey, data);
|
||||
String m = new String(decryptedData);
|
||||
if ("ok".equals(m)) {
|
||||
log.info("Successfully established encrypted link");
|
||||
log.info("Encrypted link established successfully");
|
||||
} else {
|
||||
ctx.channel().close();
|
||||
}
|
||||
|
||||
+27
-8
@@ -23,8 +23,12 @@
|
||||
package org.dromara.neutrinoproxy.core;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
|
||||
import io.netty.util.Attribute;
|
||||
import org.dromara.neutrinoproxy.core.util.SmEncryptUtil;
|
||||
|
||||
import static org.dromara.neutrinoproxy.core.Constants.*;
|
||||
|
||||
/**
|
||||
@@ -70,28 +74,43 @@ public class ProxyMessageDecoder extends LengthFieldBasedFrameDecoder {
|
||||
return null;
|
||||
}
|
||||
|
||||
int frameLength = in.readInt();
|
||||
if (in.readableBytes() < frameLength) {
|
||||
int packageLength = in.readInt();
|
||||
if (in.readableBytes() < packageLength) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 获取加密数据
|
||||
byte[] encryptedBytes = new byte[packageLength];
|
||||
in.readBytes(encryptedBytes);
|
||||
in.release();
|
||||
|
||||
// 获取解密密钥
|
||||
Attribute<byte[]> secureKeyAttr = ctx.attr(SECURE_KEY);
|
||||
byte[] secureKey = secureKeyAttr.get();
|
||||
// 解密
|
||||
byte[] decryptedData = SmEncryptUtil.decryptBySm4(secureKey, encryptedBytes);
|
||||
|
||||
ByteBuf buf = Unpooled.wrappedBuffer(decryptedData);
|
||||
|
||||
ProxyMessage proxyMessage = new ProxyMessage();
|
||||
byte type = in.readByte();
|
||||
long sn = in.readLong();
|
||||
int frameLength = buf.readInt();
|
||||
byte type = buf.readByte();
|
||||
long sn = buf.readLong();
|
||||
|
||||
proxyMessage.setSerialNumber(sn);
|
||||
|
||||
proxyMessage.setType(type);
|
||||
|
||||
int infoLength = in.readInt();
|
||||
int infoLength = buf.readInt();
|
||||
byte[] infoBytes = new byte[infoLength];
|
||||
in.readBytes(infoBytes);
|
||||
buf.readBytes(infoBytes);
|
||||
proxyMessage.setInfo(new String(infoBytes));
|
||||
|
||||
byte[] data = new byte[frameLength - TYPE_SIZE - SERIAL_NUMBER_SIZE - INFO_LENGTH_SIZE - infoLength];
|
||||
in.readBytes(data);
|
||||
buf.readBytes(data);
|
||||
proxyMessage.setData(data);
|
||||
|
||||
in.release();
|
||||
buf.release();
|
||||
|
||||
return proxyMessage;
|
||||
}
|
||||
|
||||
+26
-8
@@ -23,8 +23,12 @@
|
||||
package org.dromara.neutrinoproxy.core;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.MessageToByteEncoder;
|
||||
import io.netty.util.Attribute;
|
||||
import org.dromara.neutrinoproxy.core.util.SmEncryptUtil;
|
||||
|
||||
import static org.dromara.neutrinoproxy.core.Constants.*;
|
||||
|
||||
/**
|
||||
@@ -40,6 +44,7 @@ public class ProxyMessageEncoder extends MessageToByteEncoder<ProxyMessage> {
|
||||
|
||||
@Override
|
||||
protected void encode(ChannelHandlerContext ctx, ProxyMessage msg, ByteBuf out) throws Exception {
|
||||
|
||||
int bodyLength = TYPE_SIZE + SERIAL_NUMBER_SIZE + INFO_LENGTH_SIZE;
|
||||
byte[] infoBytes = null;
|
||||
if (msg.getInfo() != null) {
|
||||
@@ -51,21 +56,34 @@ public class ProxyMessageEncoder extends MessageToByteEncoder<ProxyMessage> {
|
||||
bodyLength += msg.getData().length;
|
||||
}
|
||||
|
||||
// write the total packet length but without length field's length.
|
||||
out.writeInt(bodyLength);
|
||||
ByteBuf buf = Unpooled.buffer(bodyLength);
|
||||
|
||||
out.writeByte(msg.getType());
|
||||
out.writeLong(msg.getSerialNumber());
|
||||
// write the total packet length but without length field's length.
|
||||
buf.writeInt(bodyLength);
|
||||
|
||||
buf.writeByte(msg.getType());
|
||||
buf.writeLong(msg.getSerialNumber());
|
||||
|
||||
if (infoBytes != null) {
|
||||
out.writeInt(infoBytes.length);
|
||||
out.writeBytes(infoBytes);
|
||||
buf.writeInt(infoBytes.length);
|
||||
buf.writeBytes(infoBytes);
|
||||
} else {
|
||||
out.writeInt(0x00);
|
||||
buf.writeInt(0x00);
|
||||
}
|
||||
|
||||
if (msg.getData() != null) {
|
||||
out.writeBytes(msg.getData());
|
||||
buf.writeBytes(msg.getData());
|
||||
}
|
||||
|
||||
// 执行加密
|
||||
byte[] data = new byte[bodyLength];
|
||||
buf.readBytes(data);
|
||||
// 获取加密密钥
|
||||
Attribute<byte[]> secureKeyAttr = ctx.attr(SECURE_KEY);
|
||||
byte[] secureKey = secureKeyAttr.get();
|
||||
// 执行加密
|
||||
byte[] encryptedData = SmEncryptUtil.encryptBySm4(secureKey, data);
|
||||
out.writeByte(encryptedData.length);
|
||||
out.writeBytes(encryptedData);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user