部分解压缩并估计实际解压缩数据消息的大小

Partially decompress and estimate size of actual decompressed data message

我有一个简单的要求,如果超过 X 字节的上限,我想丢弃或不处理消息。但是,发送方可以压缩消息并发送。如果用户创建一个随机消息,比如全 0 或 1 等,则压缩熵会发生很大变化。但是,假设受信任的发件人有办法查看压缩消息并估计其解压时的实际大小。我正在使用 java.util.zip 使用 Zip 协议,但我愿意接受其他库或语言中的任何解决方案。

不是真的。

Deflate 是一种流格式,它在开始之前对数据一无所知,因此它无法嵌入解压后的大小(像 snappy、brieflz 等格式)。

可能您能做的最好的事情是使用流 API 最多解压缩 MAX_MESSAGE_SIZE 字节(您可能需要使用 MAX_MESSAGE_SIZE + 1;使用 zlib 很难判断是否到达了流的末尾,或者它是否只是处理了所有可用的输入,除非你给它足够的空间来实际解压缩更多数据)。如果您认为消息太长,这不会让您 early 停止处理,但是一旦消息真的太长(这应该足以减轻DoS).

不幸的是,您不能仅根据所见估计总大小,因为有人很容易在流的开头拥有难以压缩的数据,然后是一百万个相同的字节 非常压缩得很好。