我有一个简单的要求,如果消息超过 X 字节的上限,我想丢弃或不处理它。但是,发件人可以压缩消息并发送。如果用户创建一个随机消息,例如全 0 或 1 等,则压缩熵变化很大。然而,假设一个受信任的发件人有办法窥视压缩消息并在解压缩时估计其实际大小。我正在使用使用 java.util.zip 的 Zip 协议,但我对其他库或语言中的任何解决方案持开放态度。
问问题
76 次
1 回答
1
并不真地。
Deflate 是一种流格式,它在开始之前对数据一无所知,因此无法嵌入解压缩后的大小(snappy、brieflz 等格式)。
可能你能做的最好的事情是使用流 API 来解压缩最多MAX_MESSAGE_SIZE
字节(你可能需要使用MAX_MESSAGE_SIZE + 1
; 使用 zlib 很难判断是否到达了流的末尾,或者它是否只是处理了所有可用的输入除非您给它足够的空间来实际解压缩更多数据)。如果您认为消息太长,这不会让您提前停止处理,但会让您在消息真的太长时立即停止(这应该足以缓解 DoS)。
不幸的是,你不能仅仅根据你所看到的来估计总大小,因为有人很容易在流的开头拥有难以压缩的数据,然后是一百万个相同的字节,这些字节将被很好地压缩。
于 2015-12-30T19:10:12.607 回答