Netty 报文解析长度加密

2021-10-06 11:40:36 +08:00
 lslvxy

用 netty 解析 tcp 报文 格式是 固定 4 字节长度+消息体, 准备用 LengthFieldBasedFrameDecoder 解析的 但是这个消息头的 4 个字节也是加密的,要先解密一下才能获取到消息体的正确长度 这个要怎么搞呢

1911 次点击
所在节点    Java
9 条回复
AlexRoot
2021-10-06 11:44:14 +08:00
固定长度的解析应该是提前在协议里确定好的吧。
lslvxy
2021-10-06 11:50:04 +08:00
@AlexRoot 不是固定长度,是消息头前 4 个字节表示消息长度,但是这 4 个字节也是加密过了的
90xchun
2021-10-06 12:19:00 +08:00
把长度这个字段也加下密就可以了吧,有啥问题呢?
pmsg863
2021-10-06 15:38:49 +08:00
加密后消息长度不会变吧?如果加密和解析后的 byte[]长度一致就比较简单,修改下 LengthFieldBasedFrameDecoder 源码,做个解密即可,对消息长度做个校验,超范围或解密失败跳过相关流数据或链路重置。
darkengine
2021-10-07 14:35:35 +08:00
这个协议定的有问题吧。完整消息包的长度是加密的,那么就无法知道应该取多长的 byte[]下来进行解密,然后不解密又不知道前 4 个字节的里保存的消息体长度是多少。。。这个项目已经跑起来了吗?好奇插个眼。
lei2j
2021-10-07 16:35:12 +08:00
长度也加密,那我挺好奇加密后的长度是多少呢?如果不是固定的,那怎么读取呢
lslvxy
2021-10-08 10:02:17 +08:00
@darkengine
@lei2j
我也觉得这个协议定的有问题
解析的时候就出现很多对不上的数据
还要自己拆包分包
先取前 4 个字节 解密得到 body 的长度
再根据长度获取消息体数据
再解析 body 到实体类上
orionleo
2021-10-08 13:33:27 +08:00
你可以试一下能不能在 LengthFieldBasedFrameDecoder 之前调用自定义的 handler 把消息头中的长度解密出来后重新封装成 [真实的消息长度] + [消息体],传递给 LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4)。
cubecube
2021-10-09 11:19:11 +08:00
client server 都是你的话,那么你可以再加一层 length 包一下
如果只是 client,那么他们 server 怎么 encode 的,你去 decode 对应一下就行。总得有 demo 吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/806056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX